Solución:
Para filtrar correos electrónicos válidos para su uso en el campo de correo electrónico del destinatario, eche un vistazo a filter_var()
:
$email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL);
if ($email === FALSE) {
echo 'Invalid email';
exit(1);
}
Esto asegurará que sus usuarios solo proporcionen correos electrónicos singulares y válidos, que luego puede pasar al mail()
función. Hasta donde yo sé, no hay forma de inyectar encabezados a través del cuerpo del mensaje usando PHP mail()
función, por lo que los datos no deberían necesitar ningún procesamiento especial.
Actualizar:
Según la documentación de mail()
, cuando está hablando directamente con un servidor SMTP, deberá evitar paradas completas en el cuerpo del mensaje:
$body = str_replace("n.", "n..", $body);
Actualización n. ° 2:
Aparentemente, también es posible inyectar a través del sujeto, pero como no hay FILTER_VALIDATE_EMAIL_SUBJECT
, deberá realizar el filtrado usted mismo:
$subject = str_ireplace(array("r", "n", '%0A', '%0D'), '', $_POST['subject']);
Suponga que desea poner la dirección de correo electrónico del visitante en el campo de encabezado opcional así:
$headers = "From: $visitorEmailAddress";
Sin embargo, si
$ visitanteEmailAddress
contiene
“[email protected] n nBCC:[email protected]”
se ha convertido en un host de spam, abriendo la puerta a la inyección de correo. Este es un ejemplo muy simple, pero los spammers creativos y los piratas informáticos malintencionados pueden introducir scripts potencialmente dañinos en su correo electrónico, ya que el correo electrónico se envía como un archivo de texto sin formato. Incluso los archivos adjuntos se convierten en texto sin formato y pueden enviar archivos adjuntos fácilmente agregando una línea de contenido de tipo mime.
Si la validación de su formulario para los campos FROM y / o TO está bien, debe mirar la validación del formulario para el cuerpo del correo electrónico. Quitaría los caracteres ‘- =’ y ‘= -‘, y evitaría que los usuarios escribieran HTML sin formato usando strip_tags()
.