E-mails Seguros PHP

No script de e-mail PHP do último capítulo, há uma vulnerabilidade.

Injeção de E-mail PHP

Primeiro, veja o código PHP do último capítulo:

<html>
<body>
<?php
if (isset($_REQUEST['email']))
//Se "email" estiver preenchido, envie e-mail
  {
  //enviar e-mail
  $email = $_REQUEST['email']; 
  $subject = $_REQUEST['subject'];
  $message = $_REQUEST['message'];
  mail("someone@example.com", "Subject: $subject",
  $message, "From: $email" );
  echo "Thank you for using our mail form";
  }
else
//Se "email" não estiver preenchido, exiba o formulário
  {
  echo "<form method='post' action='mailform.php'>
  E-mail: <input name='email' type='text' /><br />
  Assunto: <input name='subject' type='text' /><br />
  Mensagem:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

O problema com o código acima é que usuários não autorizados podem inserir dados no cabeçalho do e-mail através do formulário.

Se o usuário adicionar esses textos nos campos de entrada do formulário, o que acontecerá?

someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
%0ABTo:person6@example.com

Como de costume, a função mail() coloca o texto acima no cabeçalho do e-mail, então agora o cabeçalho tem os campos adicionais Cc:, Bcc: e To:. Quando o usuário clicar no botão enviar, este e-mail será enviado para todos os endereços acima!

Prevenção de Injeção de E-mail PHP

A melhor maneira de evitar a injecção de e-mail é validar a entrada.

O código abaixo é semelhante ao anterior, mas já adicionamos a verificação de validação de entrada do campo e-mail do formulário:

<html>
<body>
<?php
function spamcheck($field)
  {
  //filter_var() sanitiza o e-mail 
  //endereço usando FILTER_SANITIZE_EMAIL
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
  //filter_var() valida o e-mail
  //endereço usando FILTER_VALIDATE_EMAIL
  if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }
if (isset($_REQUEST['email']))
  //se "e-mail" estiver preenchido, prossiga
  //verificar se o endereço de e-mail é inválido
  $mailcheck = spamcheck($_REQUEST['email']);
  if ($mailcheck==FALSE)
    {
    echo "Entrada inválida";
    }
  else
    //enviar e-mail
    $email = $_REQUEST['email']; 
    $subject = $_REQUEST['subject'];
    $message = $_REQUEST['message'];
    mail("someone@example.com", "Subject: $subject",
    $message, "From: $email" );
    echo "Thank you for using our mail form";
    }
  }
else
  //if "email" is not filled out, display the form
  echo "<form method='post' action='mailform.php'>
  E-mail: <input name='email' type='text' /><br />
  Assunto: <input name='subject' type='text' /><br />
  Mensagem:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

No código acima, usamos os filtros PHP para validar a entrada:

  • FILTER_SANITIZE_EMAIL remove caracteres ilegais do e-mail da string
  • FILTER_VALIDATE_EMAIL valida o endereço de e-mail

Você pode encontrar em nosso Filtros PHPNesta seção, leia mais sobre os filtros.