0

Vulnerabilidade em formulário PHP

criado por Ferenz Networks em 06/10/2012 4:46pm
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:
<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> 
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
<?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);
?> 
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):
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.
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:
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.

Comentários:

Nenhum comentário foi enviado ainda.

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)