Envío seguro de correos vía PHP

Cómo hacer más seguro el envío de correos vía PHP

Es bastante común el uso de formas para enviar correo en línea. Formas de contacto, envíos varios de aviso al llenar una encuesta, etc.  Y la mayoría de nosotros utiliza la función Mail () de la manera siguiente:

<html>
<body>

<?php
if (isset($_REQUEST[‘email’]))
//si «email» tiene un valor, envía el mensaje de correo
{
//enviar correo
$emailfrom = «correo@tudominio.com» ;
$emailto = $_REQUEST[‘email’] ;
$subject = $_REQUEST[‘subject’] ;
$message = $_REQUEST[‘message’] ;
mail($emailto, «Subject: $subject»,
$message, «From: $emailfrom» );
echo «Gracias por contactarnos!»;
}
else
//si «email» no tiene un valor, entonces se muestra nuevamente la forma.
{
echo «<form method=’post’ action=’correoforma.php’>
Email: <input name=’email’ type=’text’><br>
Subject: <input name=’subject’ type=’text’><br>
Mensaje:<br>
<textarea name=’message’ rows=’15’ cols=’40’>
</textarea><br>
<input type=’submit’>
</form>»;
}
?>

</body>
</html>

Cómo puedes ver la página PHP se llama correoforma.php. El problema con el código que se muestra aquí es que usuarios malintencionados y no autorizados pueden insertar datos en los encabezados del correo a través de la misma forma.

¿Qué sucedería si un usuario incorpora el texto siguiente en el campo input email en la forma?

alguien@ejemplo.com%0ACc:persona2@ejemplo.com
%0ABcc:persona3@ejemplo.com,persona3@ejemplo.com,
otrapersona4@ejemplo.com,persona5@ejemplo.com
%0ABTo:persona6@ejemplo.com

La función Mail ( ) colocará el texto que aquí se muestra en los encabezados del correo, como lo hace normalmente. La única diferencia es que ahora tendrá un campo extra de Cc (con copia) y otro de Bcc (copia invisible o blank copy), así como  el campo To (Para) normal. Cuando el usuario de click sobre el botón de enviar (submit), enviará una copia a todas las direcciones listadas arriba. ¡Eso sería un mensaje para 7 personas!

Cómo detener las inyecciones de correo electrónico en PHP

La mejor manera de controlar y detener las inyecciones a través del correo electrónico es validar la entrada (input).

El código que se muestra abajo es el mismo que el anteriormente mostrado, pero ahora se le han incorporado algunas validaciones de entrada que revisa el campo de email en la forma:

<html>
<body>
<?php
function spamcheck($field)
{
//filter_var() depura el correo
//correo usando FILTER_SANITIZE_EMAIL
$field=filter_var($field, FILTER_SANITIZE_EMAIL);

//filter_var() valida el correo
//correo usando FILTER_VALIDATE_EMAIL
if(filter_var($field, FILTER_VALIDATE_EMAIL))
{
return TRUE;
}
else
{
return FALSE;
}
}

if (isset($_REQUEST[‘email’]))
{
//si «email» tiene valor, proceder

//revisar si la dirección de correo es inválida
$mailcheck = spamcheck($_REQUEST[‘email’]);
if ($mailcheck==FALSE)
{
echo «Entrada inválida»;
}
else
{
//enviar correo
$emailfrom = «correo@tudominio.com» ;
$emailto = $_REQUEST[‘email’] ;
$subject = $_REQUEST[‘subject’] ;
$message = $_REQUEST[‘message’] ;
mail($emailto, «Subject: $subject»,
$message, «From: $emailfrom» );
echo «Gracias por contactarnos!»;
}
}
else
{
//si «email» no tiene valor, mostrará la forma
echo «<form method=’post’ action=’correoforma.php’>
Email: <input name=’email’ type=’text’><br>
Subject: <input name=’subject’ type=’text’><br>
Mensaje:<br>
<textarea name=’message’ rows=’15’ cols=’40’>
</textarea><br>
<input type=’submit’>
</form>»;
}
?>

</body>
</html>

En el código que se muestra aquí se utilizan filtros PHP para validar la entrada (input). Los filtros utilizados son:

El filtro FILTER_SANITIZE_EMAIL elimina todo caracter ilegal o no permitido en la cadena o string del correo
El filtro  FILTER_VALIDATE_EMAIL valida que el valor es una dirección de correo correcta.

No lo dejes pasar. Recuerda que es conveniente proteger tus formas de contacto y todo envío de correos en línea en tu sitio a través de este método.