No script de e-mail PHP da seção anterior, há uma vulnerabilidade.
Primeiro, observe o código PHP do capítulo anterior:
<html><head><meta charset="utf-8"><title>Tutorial do codificador (codercto.com)</title></head><body><?phpif (isset($_REQUEST['email' ] )) { // Se o parâmetro email for recebido, envie um email // Envie um email $email = $_REQUEST['email'] ; $_REQUEST['message'] ; mail("[email protected]", $subject, $message, "From:" . $email); echo "Mail enviado com sucesso";} else { // Se não houver e-mail parâmetro então Exibir formulário echo "<form method='post' action='mailform.php'> Email: <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 email por meio do formulário de entrada.
O que acontecerá se o usuário adicionar o seguinte texto ao e-mail na caixa de entrada do formulário?
algué[email protected]%0ACc:[email protected]%0ABcc:[email protected],[email protected],[email protected],[email protected]%0ABTo:[email protected]
Como de costume, a função mail() coloca o texto acima no cabeçalho do e-mail, então o cabeçalho agora tem campos Cc:, Cco: e Para: adicionais. Quando o usuário clicar no botão enviar, este e-mail será enviado para todos os endereços acima!
A melhor maneira de evitar a injeção de e-mail é validar a entrada.
O código a seguir é semelhante ao do capítulo anterior, mas aqui adicionamos um validador de entrada para detectar o campo email no formulário:
<html><head><meta charset="utf-8"><title>Tutorial do codificador (codercto.com)</title></head><body><?phpfunction spamcheck($field){ // filter_var ( ) Filtrar e-mail // Use FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() Filtrar e-mail //); Use FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE } else { return FALSE; // Determine se o e-mail é legal $mailcheck = spamcheck($_REQUEST['email']); ($mailcheck==FALSE) { echo "Entrada ilegal"; else { // Enviar e-mail $email = $_REQUEST['email'] ; mensagem']; mail("algué[email protected]", "Assunto: $assunto", $mensagem, "De: $email" ); para usar nosso formulário de email"; }}else{ // Se não houver nenhum parâmetro email, exiba o formulário echo "<form method='post' action='mailform.php'> Email: <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 um filtro PHP para validar a entrada:
O filtro FILTER_SANITIZE_EMAIL remove caracteres ilegais de e-mail da string
O filtro FILTER_VALIDATE_EMAIL valida o valor de um endereço de e-mail
Você pode ler mais sobre filtros em nosso Filtro PHP.