Jump to content

Matheus Tavares

Moderadores
  • Content count

    1825
  • Joined

  • Last visited

  • Days Won

    32

Matheus Tavares last won the day on June 30 2018

Matheus Tavares had the most liked content!

Community Reputation

167 Muito Bom

About Matheus Tavares

  • Rank
    The Obstacle Is The Way • Ego Is The Enemy

Contato

  • Site Pessoal
    http://www.matheustavares.com.br

Recent Profile Visitors

4809679 profile views
  1. Matheus Tavares

    for

    Olá @Biel., tudo bem? Não sei se era um requisito seguir o código que você já tinha, mas resolvi reescrevê-lo utilizando uma lógica diferente. Espero que sirva. 1 - Definimos os nomes das cores e suas respectivas quantidades: $cores = [ 'blue' => 5, 'green' => 8, 'red' => 3, 'orange' => 4, ]; 2 - Fazemos o loop principal, desmembrando o nome da cor da quantidade de vezes a exibi-la: foreach ( $cores as $cor => $qtd ) { 3 - Logo após fazemos o loop repetindo a cor x vezes, onde x = $qtd. for ( $j = 1 ; $j <= $qtd ; ++$j ) { Reunindo tudo e adicionando uma variável $j para contar as iterações gerais (1 a 20), ficaria assim: <?php $cores = [ 'blue' => 5, 'green' => 8, 'red' => 3, 'orange' => 4, ]; $i = 1; foreach ( $cores as $cor => $qtd ) { for ( $j = 1 ; $j <= $qtd ; ++$i, ++$j ) { echo "{$i}-{$cor}-{$j}\n"; } } Resultado: 1-blue-1 2-blue-2 3-blue-3 4-blue-4 5-blue-5 6-green-1 7-green-2 8-green-3 9-green-4 10-green-5 11-green-6 12-green-7 13-green-8 14-red-1 15-red-2 16-red-3 17-orange-1 18-orange-2 19-orange-3 20-orange-4 * No caso você iria provavelmente querer trocar \n por <br>, para quebrar as linhas em html.
  2. Matheus Tavares

    Crontab - como executar mais de um script de uma só vez

    Hehe, que bom que deu certo! Acredito que esteja ok sim, apenas acho que você deveria rodar as crons em um servidor e não na sua máquina local. Na AWS você poderia rodar de graça por 1 ano inteiro essas crons (depois pode criar uma conta nova e aproveitar outro ano :P). Para isso você iria criar uma instância no EC2 chamado t2.micro, que possui 1gb de ram e 1 vCPU. https://aws.amazon.com/pt/ec2/instance-types/ Poderia ser manualmente pelo EC2 ou através do Elastic Beanstalk (que cria a máquina EC2 para você de forma automática e coloca seu código pra rodar). Vale a pena dar uma olhada nesses serviços.
  3. Matheus Tavares

    Popular uma tag META

    Olá @notax, tudo bem? Isso não faz sentido, meu amigo. Sua hospedagem não deve interferir nos seus arquivos JS, ao menos que seu código possua falhas de segurança ou códigos maliciosos que possam afetar os demais clientes, e ainda assim isso deve estar explicitamente descrito nos termos de uso dessa empresa. Pode usar window.location.href sim.
  4. Matheus Tavares

    Crontab - como executar mais de um script de uma só vez

    Olá @biakelly, tudo bem? :) 1 - Geralmente você precisa reiniciar o servidor de cron para que suas alterações sejam efetivadas. Acho que no ubuntu você faz com o systemctl, então seria isso: systemctl restart *seu software de cron* Onde o software pode ser: cron, dcron, cronie, fcron, anacron. Eu particularmente uso o cronie na minha máquina e nunca tive problemas, mas já utilizei outras em máquinas com diferentes sistemas. O procedimento não é diferente. Você pode desinstalar sua implementação de cron e instalar uma nova para testar também. 2 - Utilize o comando crontab -e para fazer a definição das suas tarefas. crontab -l para listá-las. Você não deve precisar mais do que esses 2 comandos e a reinicialização do serviço. Veja: https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-ubuntu-1804-pt 3 - E por fim, a tarefa cron não deveria estar na sua máquina local, mas no seu servidor. Sua máquina é para desenvolvimento. Você deveria poder desligá-la e saber que suas tarefas continuam rodando. Quem deve fazer a execução dos scripts é o seu servidor. Se o seu servidor é cPanel, se não me engano geralmente há uma seção do painel destinada apenas para isso, de forma gráfica, sem necessidade de comandos de terminal. E você não deve usar o curl, pois ao fazer isso você cria uma requisição, e isso chama o servidor web, que torna tudo mais lento e consome mais recursos de máquina. Certa vez desenvolvi um sistema de disparo de e-mails que estava muito lento. Resolvi com algumas leves mudanças, mas a principal foi essa. Você deveria criar suas crons mais ou menos assim: */30 * * * * /usr/bin/php /home/bia/cronjobs/aquivo1.php > /home/bia/log_arquivo1.log * * * * * /usr/bin/php /home/bia/cronjobs/aquivo2.php > /home/bia/log_arquivo2.log * * * * * /usr/bin/php /home/bia/cronjobs/aquivo3.php > /home/bia/log_arquivo3.log * * * * * /usr/bin/php /home/bia/cronjobs/aquivo4.php > /home/bia/log_arquivo4.log * * * * * /usr/bin/php /home/bia/cronjobs/aquivo5.php > /home/bia/log_arquivo5.log Isso se for para rodar diretamente na sua máquina. Observe que /usr/bin/php é o caminho do binário do php. Você pode descobrir esse caminho rodando no seu terminal isso: which php. Daí você substitui pelo caminho que coloquei ali, que é o meu caso, mas pode ser diferente do seu. Em um cPanel o comando seria diferente e o caminho do seu arquivo php também. Perceba que defini um caminho para registro dos logs. Você deve verificar se esse arquivo está sendo criado. Se os arquivos de log estiverem sendo criados, sua cron está rodando, mas provavelmente está ocorrendo algum erro no seu PHP. Isso o log vai dizer. Lembre-se de que para o PHP exibir os erros, você precisa habilitá-los, com error_reporting( E_ALL ); Ao fazer isso >/dev/null 2>&1, você estava descartando os logs, que são importantes para verificar se tudo está rodando como esperado.
  5. Matheus Tavares

    Até onde posso confiar na classe finfo

    Em tempo: citei o S3 também pela facilidade de uso. Veja como é simples fazer um upload pra lá: https://devcenter.heroku.com/articles/s3-upload-php
  6. Matheus Tavares

    Até onde posso confiar na classe finfo

    Fala @Omar~, tudo certo? Vamos lá: Mais ou menos. Pelo menos não de olhos fechados. Segurança para upload de arquivos é um assunto um pouco mais profundo. Não basta se preocupar com o mime do arquivo, pois ele é manipulável. Veja um exemplo (imagem png com código php/js embutido): https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/ Lembre-se de que camuflar arquivos maliciosos em arquivos aparentemente inofensivos não é exclusivo a aplicações web. Os anti-vírus estão há decadas criando soluções para evitar esse tipo de problema. A questão é: você se preocupa que um usuário baixe um vírus enviado anteriormente por um usuário, ou apenas se preocupa com a segurança de sua aplicação? Pois para o primeiro caso, eu iria sugerir que você rodasse em uma solução como no virustotal, por exemplo, mas isso seria no caso de permitir aos usuários que enviassem arquivos mais genéricos como zip, rar, 7zip, iso, exe, msi, gzip, tar, rpm, etc. É um ponto que não devemos ignorar, mas acredito que suas preocupações estejam na aplicação em si, então vamos prosseguir: Você não deve confiar no $_FILES, pois ele é literalmente informado pelo navegador, mas isso você já sabia. A partir do momento que você passa a utilizar o módulo Fileinfo (finfo), você transfere a responsabilidade de analisar o conteúdo do arquivo ao servidor, e isso promove sua aplicação de 10% de segurança para uns bons 50~60% de segurança (no que tange o upload dos arquivos). Você poderia ainda, no entanto, se preocupar com alguns pontos importantes: 1 - Não nomear os arquivos enviados com extensões sugeridas pelo nome original do arquivo. Exemplo do arquivo enviado: meu_arquivo.php.png Essa dupla extensão pode ser explorada através de Null byte injection ou mod_mime do PHP (que pode processar arquivos PHP com dupla extensão). Então vamos supor que você upou o arquivo com o nome acima. Caso o mod_mime não o ajude arbitrariamente, você poderia ainda assim processá-lo como PHP assim: http://site.com/uploads/meu_arquivo.php%00 Uma boa prática seria aplicar um UUID e uma tabela de extensões. Exemplo: Mime: image/jpeg Arquivo: 123e4567-e89b-12d3-a456-426614174000.jpg Perceba que .jpg não é por causa do nome original do arquivo, mas pq eu inferi através do mime. Isso você faria com um array associativo de mimes/extensões, por exemplo. Caso você não queira modificar o nome do arquivo, não tem problema, mas não permita caracteres fora do range do alfabeto, números e alguns poucos caracteres como underscore "_" ----> [a-zA-Z0-9_-] Isso já iria automaticamente remover as extensões, uma vez que você estaria removendo os pontos. Por algum tempo em uma aplicação eu literalmente não aplicava extensão nenhuma nos arquivos. Os arquivos tinham nomes assim: 8ats9d786astn9d8 8nyda08f7tn2h98z ... Eu fazia isso em uma CDN onde eu informava o mime/type na resposta da requisição, nunca gerando problemas para acessá-los. Mas quis apenas compartilhar mesmo, pois não é uma boa prática. Deixei de fazer isso depois que tive problemas de cache por parte da Cloudflare, que não reconhecia os arquivos corretamente. Apenas não confie na extensão que o usuário informa, mas aplique uma extensão coerente ao conteúdo do arquivo, baseada no MIME. 2 - Bom, mime verificado, extensão não influenciada, o próximo passo é pensarmos: qual o real risco para a minha aplicação se alguém enviar um arquivo contendo códigos que possa ser interpretado pelo servidor? O risco são na verdade dois: - LFI, ou Local File Inclusion. É quando temos inclusões variáveis com dados originados na requisição, como nesse exemplo: <?php $pagina = $_GET[ 'pag' ]; include( "paginas/{$pagina}.php" ); Daí você acessa o site assim: http://site.com/?pag=../../../../../etc/passwd%00 Ou: http://site.com/?pag=../uploads/arquivo_que_acabei_de_enviar Isso é facilmente corrigido filtrando a string $pagina, mas você sabe disso. - O outro caso seria de literalmente acessarmos o arquivo como no exemplo do primeiro link que citei nesse post: http://example.org/images/test.png?zz=alert("this is xss :("); Observe neste exemplo que o arquivo chamado é o próprio enviado, e ele inclusive é um png, mas com PHP injetado. Isso poderia ser evitado, mesmo com um png malicioso, desativando a execução do PHP nesse diretório, o que torna todo aquele esforço do artigo sem sentido, entende? É aí que vamos diminuindo drasticamente os riscos de brechas de segurança. Isso poderia ser feito criando um .htaccess (falando de Apache. Outros webservers = outras soluções) no diretório com o seguinte conteúdo: php_flag engine off Veja mais: http://docs.php.net/manual/en/apache.configuration.php#ini.engine Em muitos artigos você vai encontrar as seguinte sugestões ainda, que se você analisar com calma, vai perceber que são apenas redundâncias para as medidas que já citei acima (mas é bom lembrar que redundância em segurança não é nada ruim!): Varrer o arquivo para verificar se possui abertura de tags PHP "<?", mas acho um método muito falho, pois é abrangente demais e pode acabar gerando falsos-positivos. Reprocessar as imagens usando GD ou imagick. Também não é uma solução absoluta, pois podemos ter comentários e metadados em arquivos de imagens que podem ser explorados com a finalidade de injetar códigos maliciosos, mas ajuda, principalmente se você chamar essas funções habilitando configurações de compressão e remoção de lixo. A questão é que isso só é válido para imagens, o que não é o seu caso. Criar uma espécie de pequeno web firewall, onde você colocaria seus arquivos em uma pasta absolutamente fora de public e os traria apenas quando solicitado, manualmente, via código PHP, com readfile, por exemplo. Na minha opinião, um grande desperdício de recursos de máquina e tempo de programação em cima disso, mas não deixa de ter o seu valor. Ler o cabeçalho do arquivo (primeiros ~20 bytes) e comparar com a tabela Magic, mas isso é exatamente o que o Fileinfo faz. Você estaria sendo redundante e perdendo tempo com algo que não deveria ser uma preocupação sua. Mas o mais importante eu guardei para a conclusão: não salve os arquivos no mesmo servidor que processa a lógica da aplicação! Por diversas razões, e não apenas por segurança. Você desacopla seu código (lógica) de dados de execução, o que é um grande avanço para aplicações escaláveis (que podem crescer indefinidamente em quantidade de máquinas), uma vez que os acessos aos arquivos agora seriam apenas urls externas de servidores que apenas entregam arquivos, e não arquivos armazenados na mesma máquina. Exemplo: http://site.com.br/uploads/arquivo.xls Agora seria: http://arquivos.site.com.br/arquivo.xls Perceba que arquivos.site.com.br não é apenas um subdomínio ou redirecionamento, mas um servidor à parte, que pode ser universalmente utilizado por todas as máquinas. E como você faria isso? É muito difícil? Muito caro? Fácil e barato: S3 + Cloudflare. Custos do S3: https://aws.amazon.com/pt/s3/pricing/ Cloudflare pode ser o plano gratuito. Citei o S3 pois estou mais acostumado, mas tem ainda as soluções da Microsoft (Azure), Google Cloud Computing, e aquele outro que tem nome de Pokémon, mas não lembro agora =P Basta mandar os arquivos para o S3 e depois aplicar o cache pela Cloudflare. Isso garantirá custos baixos de tráfego se os arquivos não forem muito grandes e estiverem dentro da cota de cache da Cloudflare. Digo isso pois manter os arquivos na S3 é barato, mas o custo do tráfego pode surpreender dependendo do seu uso. Por isso a cloudflare ajuda (e muito). Resumindo: Fileinfo, junto a boas práticas para evitar vulnerabilidades no upload vão te dar uma confiabilidade altíssima, mas construir uma pequena CDN e mandar arquivos para serem servidos por ela leva seu app a outro nível com muito mais facilidade :)
  7. Matheus Tavares

    Erro: Cannot modify header information - headers already sent by

    Em tempo... preciso chamar atenção para essa função: header("Location: ".URL.DIRECTORY_SEPARATOR.$url); A constante DIRECTORY_SEPARATOR é para ser substituida por barra / (notação Unix) ou contra-barra \ (notação Windows), de acordo com o sistema do servidor. Exemplo: Caminho no Linux: /home/sapinn/Downloads/arquivo.pdf Caminho no Win: C:\Users\sapinn\Downloads\arquivo.pdf Perceba que não tem relação com URL, onde sempre utilizamos a barra normal, exemplo: google.com/link-qualquer. Portanto, assim seria mais correto: header('Location: ' . URL . '/' . $url); E por fim, você deve inserir um exit() logo após a linha do header, pois dificilmente iria querer que seu código PHP continuasse sendo executado após uma declaração de redirecionamento. Isso é importante. header('Location: ' . URL . '/' . $url); exit();
  8. Matheus Tavares

    Erro: Cannot modify header information - headers already sent by

    Olá @Sapinn. Muito provavelmente você possui um desses cenários: 1 - Algum(ns) arquivo(s) com codificação UTF-8 BOM (byte-order mark). Preferencialmente seus arquivos devem estar em UTF-8. Essa print é no Notepad++, onde você pode fazer a remoção do BOM com facilidade. ANSI também é aceitável. Se o seu arquivo estiver em ANSI, mantenha-o assim para evitar problemas com acentos. 2 - Alguma quebra de linha após um fechamento de tag ?>. No PHP, a tag de fechamento ?> é opcional, ou seja, se você não deseja inserir nenhum HTML após o PHP, basta finalizar suas linhas de código e omitir o fechamento. Por que isso seria uma boa prática? Porque evita que seu código envie à resposta caracteres indesejados. Veja um exemplo: <?php class MinhaClasse { } ?> *aqui é onde pode ter caracteres invisíveis desnecessários* Seus arquivos podem perfeitamente ser escritos assim: <?php class MinhaClasse { } 3 - Alguma saída, caractere, quebra de linha ou chamada de funções como echo, imagejpeg, printf, print_r, etc... É com bastante confiança que afirmo que o warning que você está recebendo seja oriundo de um desses fatores. Aqui é discutido em mais detalhes essa questão: https://pt.stackoverflow.com/questions/4251/erro-cannot-modify-header-information-headers-already-sent
  9. Matheus Tavares

    Erro: Cannot modify header information - headers already sent by

    Olá @Sapinn. Você não pode chamar a session_start() depois de ter escrito alguma coisa na resposta. Certifique-se de não ter quebras de linha, html, echos e coisas assim no código que antecede o session_start. Se você não encontrar nada de anormal, peço que poste exatamente a linha e o trecho do seu código apontado pela mensagem de erro, para lhe ajudar.
  10. Matheus Tavares

    [Resolvido] Soma array

    Olá @Marcos Vinícius. Sim, seria exatamente como você descreveu. No entanto, embora eu não seja estatístico, não vejo muita utilidade na soma das médias. Talvez eu esteja enganado, mas acredito que você queira a média entre todas as médias, e isso você poderia conseguir assim: $qtd = 0; $soma = 0; while($dados = mysqli_fetch_array($resultado)){ $valor = $dados["valor"]; $dias = $dados["dias"]; $perc = $valor / $dias; $soma += $perc; ++$qtd; } echo $soma / $qtd;// média entre as médias
  11. Matheus Tavares

    [Resolvido] Calculo entre duas variáveis

    Imagina, @biakelly, ninguém nasce sabendo. :P Lembrando que bcmul é apenas uma multiplicação como qualquer outra, com duas diferenças-chave: 1 - Ele vai permitir definir a escala, ou seja, quantos dígitos eu gostaria de visualizar. Exemplo: <?php $precototal = '0.002822102460892938'; $totalemitido = '10,454,760.506412'; $precototal = str_replace( ',', '', $precototal ); $totalemitido = str_replace( ',', '', $totalemitido ); echo $precototal * $totalemitido; echo "\n"; echo bcmul( $precototal, $totalemitido, 25 ); Saída: 29504.405353192 29504.4053531916039105945184560 2 - Ele vai ser mais preciso do que as operações comuns. https://www.php.net/manual/pt_BR/language.types.float.php https://www.leaseweb.com/labs/2013/06/the-php-floating-point-precision-is-wrong-by-default/ Principalmente falando de dinheiro, você sempre vai querer utilizar funções com precisão, como as da biblioteca BCMath ou gmp.
  12. Matheus Tavares

    [Resolvido] Ajudinha com regra de preço

    Kkkk imagina :P É um incremento. Cada vez que rodamos essa linha, a variável vai aumentar seu valor em 1. Veja no manual: https://www.php.net/manual/pt_BR/language.operators.increment.php Há uma sutil diferença entre ++$var (pré-incremento) e $var++ (pós-incremento). <?php $i = 1; echo ++$i + 10;// Resultado: 12 echo "\n"; echo $i;// 2 echo "\n\n"; $i = 1; echo $i++ + 10;// Resultado: 11 echo "\n"; echo $i;// 2 No pré-incremento, primeiro faz-se a soma, depois as demais operações. No pós-incremento, primeiro as operações são executadas, depois disso a soma. Quando utilizei apenas: ++$cotacoes_utilizadas; Ele apenas somou 1. Não há outras operações, não faria nenhuma diferença utilizar o pós-incremento: $cotacoes_utilizadas++; Que ainda seria o mesmo que: $cotacoes_utilizadas += 1; Ou ainda: $cotacoes_utilizadas = $cotacoes_utilizadas + 1; Tudo a mesma coisa :)
  13. Matheus Tavares

    Regra para mensagens de BOT Telegram com PHP

    Oi @biakelly, ainda não estou 100%, mas estou melhorando bem rápido. Então, a minha resposta anterior estava se referindo apenas à união de strings com arrays baseado na sua tentativa, mas você disse algo que me chamou atenção: Talvez essa (a técnica que estava discutindo) não seja a forma correta de fazer o que você precisa. Você precisa ver bem a documentação do Telegram e alguns exemplos sobre esse recurso. Veja: https://stackoverflow.com/questions/45894518/how-to-create-inline-buttons-in-php-bot-telegram https://stackoverflow.com/questions/60529715/telegram-inline-keyboards-php https://stackoverflow.com/questions/41709382/telegram-bot-inline-keyboard-not-displaying-php https://github.com/php-telegram-bot/inline-keyboard-pagination Observe que nesses exemplos eles usam um padrão diferente do que mencionei, além de utilizarem json_encode e não urlencode. Talvez esse tutorial possa lhe ajudar nesse sentido: https://luizmarcus.com/php/utilizando-inline-keyboard-em-um-bot-para-o-telegram/
  14. Matheus Tavares

    [RESOLVIDO] Formatar número inteiro para decimal para inserir no BD

    Olá amigo, tudo bem? Seu primeiro número está, vamos supor, em centavos e você quer armazenar em reais. O number_format não vai mudar a unidade, ele vai apenas formatar a string do número para exibir com outra notação. Você precisa, então, dividir esse número por 100. Exemplo: $numero = 2961966;// centavos $numero /= 100; echo $numero;// 29619.66 (reais)
  15. Matheus Tavares

    [Resolvido] Calculo entre duas variáveis

    Olá @biakelly, você está quase lá... 1 - Precisa retirar as vírgulas, os pontos representam os decimais e precisam estar na conta. Portanto: // Primeiro retiramos a vírgula com o str_replace. // O (float) força o tipo de variável a ser um float, ou seja, número com decimais. // Se price fosse originalmente '424,123.123', isso significa que era uma string // com vírgulas representando os milhares. $price = (float)str_replace( ',', '', $price);// Agora passaria a ser 424123.123 Você faz o mesmo com a outra variável, multiplica uma pela outra e aplica o number_format. Não precisa da divisão por 10000000000... O único problema é que como são números muito grandes, talvez você precise de uma biblioteca para lidar com a precisão dessa matemática, como fiz naquele exemplo da soma da API, para você, sabe? Nesse caso a matemática seria algo assim: <?php $precototal = '0.002822102460892938'; $totalemitido = '10,454,760.506412'; $precototal = str_replace( ',', '', $precototal ); $totalemitido = str_replace( ',', '', $totalemitido ); echo $precototal . "\n"; echo $totalemitido . "\n"; echo bcmul( $precototal, $totalemitido, 10 ); Resultado: 0.002822102460892938 10454760.506412 29504.4053531916 E agora vem o number_format para colocar esse produto no padrão brasileiro, ou outro desejado, mas o resultado do cálculo é essa terceira linha.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.