• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

karva

[PHP] Segurança ao enviar emails

4 mensagens neste tópico

Muitas aplicações, e a maioria dos sites, qualquer que seja a linguagem em que tenha sido desenvolvido, precisa enviar emails, seja para contato do visitante, ou para enviar o link para um amigo, ou até mesmo como confirmação de um formulário qualquer.

Porém, se não forem tomados os devidos cuidados, sua aplicação pode ser explorada, e seu servidor pode passar a ser mais uma ferramente nas mãos dos spammers, pronto pra ficar enviando todo tipo de lixo pra meio mundo.

O principal problema com isso, além do fato do seu servidor passar a disseminar a praga que é o spam, é que seu servidor pode cair em algumas das listas negras, e com isso você passa a não conseguir mais enviar emails legítimos pra quem usa as tais listas pra se proteger contra o spam.

Resumindo: é uma dor de cabeça que você não quer ter.

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. Esse script, muitas vezes é implementado da seguinte forma, usando a função mail() do PHP:

<?php
$para = "equipe@site.com.br";
$assunto = "Contato do site";
$msg = $_POST['mensagem'];
$headers = "From: {$_POST['nome']} <{$_POST['email']}>";
mail($para, $assunto, $msg, $headers);
?>

Ou seja, 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):

<?php
From: Bruno Lustosa <bruno@lustosa.net>
To: equipe@site.com.br
Subject: Contato do site
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. Por exemplo, se no lugar do meu nome eu coloco "Buy Viagra <xx@xx.com>\nBcc: <email1@dominio1.com>, <email2@dominio2.com>, <email3@dominio3.com>, ", e na mensagem eu coloco algo sobre venda de viagra, teríamos o seguinte email montado:

<?php
From: Buy Viagra <xx@xx.com>
Bcc: <email1@dominio1.com>, <email2@dominio2.com>, <email3@dominio3.com>, <bruno@lustosa.net>
To: equipe@site.com.br
Subject: Contato do site
Compre Viagra, 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. Aconteceu em um código antigo da empresa onde estou trabalhando agora. Começamos a entrar em algumas listas negras e sem entender o porque. Quando fomos verificar a fila de emails esperando pra sair do servidor, eram mais de 30 mil spams sobre todo tipo de lixo. E vasculhando os logs do servidor web, chegamos ao script culpado.

É claro que isso NÃO É um problema do PHP. O PHP é tão seguro quanto uma pistola. Se o programador decide dar um tiro no próprio pé, não dá pra colocar a culma na arma, não é? Esse é apenas mais um exemplo do tipo de problema que podemos enfrentar quando não validamos os dados enviados pelo usuário. Sempre que qualquer informação for enviada de um lugar não confiável, essa informação deve ser checada. Uma simples verificação em $_POST['nome'], buscando por quebras de linha, ou em $_POST['email'], verificando se se trata de um email válido, já resolveria esse problema.

A grande maioria dos problemas que vemos divulgados diariamente em todo tipo de script PHP se baseiam no fato de que os programadores não tem o hábito de programar pensando em segurança, e não fazem as checagens mais básicas, deixando os scripts vulneráveis a ataques como o descrito acima e outros.

FONTE

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto devia ser movido para a secção de PHP acho eu. Anyway, parece-me uma leitura bastaste importante tanto para os iniciantes como para os "prós" :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto é sobre as boas práticas em PHP, ficava melhor nessa secção. anyway, fizeste bem em postar isto, sendo aqui ou na outra secção :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora