E-mails mais seguros no PHP

Há um problema de segurança com o script de contato do post anterior.

E-mail injection

Primeiro vamos dar uma olhada no script do post anerior:
   1:<html>
2:<body>
3:<?php
4:if (isset($_REQUEST['email'])) {
5: //send email
6: $email = $_REQUEST['email'] ;
7: $assunto = $_REQUEST['assunto'] ;
8: $mensagem = $_REQUEST['mensagem'] ;
9: mail( "alguem@exemplo.com", "Assunto: $assunto", $mensagem, "From: $email" );
10: echo "Obrigado pela sua mensagem!";
11:}
12:?>
13:<form method='post' action='mailform.php'>
14:Email: <input name='email' type='text' /><br />
15:Subject: <input name='assunto' type='text' /><br />
16:Message:<br />
17:<textarea name='mensagem' rows='15' cols='40'>
18:</textarea><br />
19:<input type='submit' value='Enviar'/>
20:</form>
21:</body>
22:</html>


O problema deste código é que um usuário mal intencionado pode inserir dados de cabeçalho por meio do campo e-mail.

O que aconteceria se o usuário colocasse o texto a seguir no campo de e-mail?
alguem@exemplo.com%0ACc:pessoa2@exemplo.com
%0ABcc:pessoa3@exemplo.com,pessoa3@exemplo.com,
outrapessoa4@exemplo.com,pessoa5@exemplo.com
%0ABTo:pessoa6@exemplo.com
A função mail() coloca este texto como cabeçalho e agora o email tem Cc, Bcc e To não esperados pelo script. O e-mail é enviado para todos os endereços acima!

Como se proteger deste problema
A melhor forma de se proteger contra e-mail injection é a validação da entrada. O código abaixo é o mesmo do post anterior, no entanto, agora nós temos validação do e-mail enviado pelo formulário:
   1:<html>
2:<body>
3:<?php
4:function spamcheck($field){
5: //filter_var() remove letras estranhas
6: //usando FILTER_SANITIZE_EMAIL
7: $field = filter_var($field, FILTER_SANITIZE_EMAIL);
8:
9: //filter_var() valida o email
10: //usando FILTER_VALIDATE_EMAIL
11: if(filter_var($field, FILTER_VALIDATE_EMAIL)){
12: return TRUE;
13: }
14: else {
15: return FALSE;
16: }
17:}
18:
19:if (isset($_REQUEST['email'])){
20: //se "email" está preenchido, continua
21: //verifica se o email é válido
22: $mailcheck = spamcheck($_REQUEST['email']);
23: if ($mailcheck == FALSE) {
24: echo "Invalid input";
25: }
26: else {//send email
27: $email = $_REQUEST['email'];
28: $assunto = $_REQUEST['assunto'];
29: $mensagem = $_REQUEST['mensagem'];
30:
31: mail("alguem@exemplo.com", "Assunto: $assunto",
32: $message, "From: $email" );
33:
34: echo "Obrigado pela sua mensagem";
35: }
36:}
37:?>
38:<form method='post' action='mailform.php'>
39:E-mail: <input name='email' type='text' /><br />
40:Assunto: <input name='assunto' type='text' /><br />
41:Mensagem:<br />
42:<textarea name='mensagem' rows='15' cols='40'>
43:</textarea><br />
44:<input type='submit' />
45:</form>
46:</body>
47:</html>
No código acima nós usamos filtros para validar o e-mail:
  • O filtro FILTER_SANITIZE_EMAIL remove todos os caracteres ilegais para um e-mail de uma string.
  • O filtro FILTER_VALIDATE_EMAIL valida se o valor é um endereço de e-mail
Estaremos fazendo um post falando somente sobre filtros no PHP.

Fonte

Nenhum comentário:

Postar um comentário