Vulnerabilidade em formulário PHP
Principais cuidados
Os cuidados que você precisa tomar no PHP pra não acabar com um problema desses é bem simples. Vamos ver passo a passo como normalmente é feito o envio de emails através do PHP e onde podemos melhorá-lo.
Um formulário típico de contato de algum site, poderia ter a forma abaixo:
Ou seja, com o formulário acima o usuário coloca seu nome, seu email e a mensagem que deseja enviar. Ao se clicar no botão de submit, os dados são passados para o script envia.php, que tem a tarefa de enviar um email com a mensagem do usuário.
Função mail() do PHP
Tudo muito bonito. O usuário envia seu nome, email e a mensagem e o script PHP manda um email para equipe@site.com.br com o conteúdo do email. Estaria perfeito se não fosse pela montagem do cabeçalho From. O grande problema está em não tratar esses dados que foram enviados pelo usuário. Se o usuário faz o envio normalmente, teríamos um email mais ou menos assim (estou ignorando alguns cabeçalhos para simplificar o exemplo):
Nesse caso postei meu nome, meu email e a mensagem acima é enviada para a equipe do site. Porém como o usuário tem o controle sobre o que entra no cabeçalho da mensagem, ele pode ser um pouco sacana e colocar uma quebra de linha no nome dele, com algumas coisas depois.
Quebra de linha
Por exemplo, se no lugar do meu nome eu coloco "xinxila <xx@xx.com>\nBcc: <email1@dominio1.com>, <email2@dominio2.com>, <email3@dominio3.com>, " e na mensagem eu coloco algo sobre xinxilas, teríamos o seguinte email montado:
Isso foi apenas um exemplo, mas dá pra combinar outras técnicas e conseguir por exemplo sobrescrever o assunto da mensagem. E hoje em dia já existem robôs vasculhando formulários de sites buscando por vulnerabilidades desse tipo.
Os cuidados que você precisa tomar no PHP pra não acabar com um problema desses é bem simples. Vamos ver passo a passo como normalmente é feito o envio de emails através do PHP e onde podemos melhorá-lo.
Um formulário típico de contato de algum site, poderia ter a forma abaixo:
<form action="envia.php" method="post"> Nome: <input type="text" name="nome" /><br /> Email: <input type="text" name="email" /><br /> Mensagem: <textarea name="mensagem"></textarea><br /> <input type="submit" /> </form>
Função mail() do PHP
<?php $para = "contato@ferenz.com.br"; $assunto = "Contato do site www.ferenz.com.br"; $msg = $_POST['mensagem']; $headers = "From: {$_POST['nome']} <{$_POST['email']}>"; mail($para, $assunto, $msg, $headers); ?>
From: Fernando Ferenz <contato@ferenz.com.br> To: equipe@site.com.br Subject: Contato do site www.ferenz.com.br Olá, aqui vai a minha mensagem.
Quebra de linha
Por exemplo, se no lugar do meu nome eu coloco "xinxila <xx@xx.com>\nBcc: <email1@dominio1.com>, <email2@dominio2.com>, <email3@dominio3.com>, " e na mensagem eu coloco algo sobre xinxilas, teríamos o seguinte email montado:
From: xinxila <xx@xx.com> Bcc: <email1@dominio1.com>, <email2@dominio2.com>, <email3@dominio3.com>, <bruno@lustosa.net> To: contato@ferenz.com.br Subject: Contato do site www.ferenz.com.br Compre xinxilas, baratinho!!
Isso foi apenas um exemplo, mas dá pra combinar outras técnicas e conseguir por exemplo sobrescrever o assunto da mensagem. E hoje em dia já existem robôs vasculhando formulários de sites buscando por vulnerabilidades desse tipo.
Novo Comentário: