E-mails Seguros PHP
- Página Anterior E-mail PHP
- Próxima Página Erro 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.
- Página Anterior E-mail PHP
- Próxima Página Erro PHP