Administración > Base de Conocimientos - FAQs > Depto. Tecnico > Correo electrónico > Como evitar el envio de Spam desde su formulario web


Como evitar el envio de Spam desde su formulario web




A veces, nuestros formularios no son seguros, y una mala o descuidada programación puede facilitar a un Spammer el usar nuestro sencillo formulario web, para enviar miles de "emails basura".

Los spammers, con el fin de realizar envío de mails rapidamente, suelen disponer de sus propios scripts personalizados para tal proyecto, los cuales ejecutan desde algún servidor.

No obstante, tambien suelen hacer uso de formularios web ya en producción: simplemente inyectando cabeceras en los mails ("email injection"), de forma que pueden modificar campos del email programado, como el asunto o incluso la cuenta emisora, pudiendo adjuntar miles de direcciones destino.

Es necesario conocer la estructura de dicha funcion:
mail (recipiente, asunto, mensaje, cabeceras extras);

La función mail() permite enviar mensajes con texto simple, sin formato y también se pueden enviar mensajes con formato HTML, por lo tanto pueden inyectar imágenes, tablas...

Un ejemplo muy básico consistiría en un archivo enviamail.html, el cual contiene un formulario que enviaría datos escritos por el cliente a un script llamado enviamail.php, que con estos datos, compondría el mensaje para enviar finalmente el email:

enviamail.html

<form method="POST" action="enviamail.php">
   Desde: <input type="text" name="remitente">
   Hacia: <input type="text" name="hacia">
   Asunto: <input type="text" name="asunto">
   Mensaje: <textarea name="mensaje" rows="10" cols="60" lines="20">Complete el mensaje.</textarea>
   <input type="submit" name="enviar" value="enviar">
</form>

enviamail.php

$hacia=$_POST['hacia'];
$remitente=$_POST['remitente'];
$asunto=$_POST['asunto'];
$mensaje=$_POST['mensaje'];
if (mail($hacia,$asunto,$mensaje,"From: $remitente ")){
echo "Email enviado a ".$hacia;
}else{
echo "Algo ha fallado.";
}
?>

 

Todas las variables del envío del email llegarán desde el formulario, lo cual no es muy habitual, pues normalmente estos formularios son de consulta, y la dirección destino suele ser un buzón de correo para contacto, que el programador incluye directamente en la variable $hacia, escrito en el archivo enviamail.php.

En el ejemplo, vemos como el campo "remitente" se coloca en la sección de cabeceras extras que usa PHP..... en este caso, se le incorpora la palabra "From: ", ya que la cabecera debe tener su identificador, al igual que otros identificadores pueden ser "Cc: " (Carbon copy o copia) o "Bcc: " (Blind Carbon Copy o copia oculta).

La inyección de código se produce cuando en el formulario, en la sección equivalente al "remitente", se añade la cadena: 

"spammer@loquesea.com%0ACc:email@v1_spam.com%0ABcc:email@v2_spam.com"

Toda esta cadena, será incorporada a los "headers" o "cabeceras extras" de la función mail de PHP... justo despues de nuestro "From: ". La cadena incluye saltos de linea en formato hexadecimal, por lo que PHP interpretará la inclusión de varias cabeceras de más...

  • "spammer@loquesea.com" será el campo from, es decir, desde dónde supuestamente se envía el mail.
  • "%0A", valor hexadecimal del caracter salto de linea
  • "Cc" copia , " Bcc" copia oculta
  • "email@vX_spam.com", direcciones de las víctimas de nuestro envío fraudulento.

Además, se pueden añadir múltiples direcciones simplemente escribiéndolas una tras otra, separadas por comas. El spammer, añadiendo una simple cadena prefabricada, ha enviado un número indeterminado de emails, con el texto y el remitente deseado.

Utilizando los saltos de línea, los headers llegarán a la funcion mail() y serán gestionados como legítimos.

Incluso es posible inyectar la cabecera "To: ", sin importar que en el email saliente ya haya un Destinatario especifado con "To: " por el programador. Se puede repetir tantas veces el destinatario como se desee, luego no haría falta usar Copias Cc o Bcc. Es más, es incluso posible llegar a modificar el asunto del email, añadiendo información o sustituyéndola, dependiendo del Software del servidor. Para ello, los spammers usan la cabecera "Subject: ".

Otros métodos posibles de alteración del email, usan cabeceras como "Content-Type: ", para añadir tipos MIME y creando emails "multipart/mixed", lo que hace que pueda llegar a escribir su propio cuerpo del mensaje, si es que el programador del formulario no permite su edición (típico ejemplo: "recomienda este sitio a un amigo..."). 

Para evitar esto puede modificar su formulario, validando los datos que se ingresen desde la web con el fin de que no haya cabeceras indexadas, y que no existan saltos de línea, herramienta usada para la inyección.

Bastaría por ejemplo, con una modificación en el archivo PHP en el que se reciben los datos del formulario:

function ValidarDatos($campo){
//Array con las posibles cabeceras a utilizar por un spammer
$badHeads = array("Content-Type:",
"MIME-Version:",
"Content-Transfer-Encoding:",
"Return-path:",
"Subject:",
"From:",
"Envelope-to:",
"To:",
"bcc:",
"cc:");  
//Comprobamos que entre los datos no se encuentre alguna de
//las cadenas del array. Si se encuentra alguna cadena se
//dirige a una página de Forbidden

foreach($badHeads as $valor){
    if(strpos(strtolower($campo), strtolower($valor)) !== false){
            header("HTTP/1.0 403 Forbidden");
            exit;
        }
    }
}

 

Ahora, en nuestro código, filtraremos el remitente (aunque podemos filtrar más variables recibidas):

ValidarDatos($_POST['remitente']);

Si la función detecta una cabecera no permitida en dicho campo, simplemente, redirige mediante la función header() al visitante, a una web de error, impidiendo el envío de datos.

Existen muchos scripts hechos por usuarios para evitar este método de envío de Spam.

Es mejor que el cliente y diseñador de la web alojada tomen consciencia de esta situación, y de este modo tomen las medidas necesarias para "filtrar" o prevenir el uso fraudulento de sus formularios; no obstante, Fenixer intenta prevenir estas inyecciones desde el uso de filtros incorporados al servidor web, en algunos casos, inutilizando cualquier envío con patrones definidos y devolviendo una web de error al spammer, loggeando los datos del intento para su revisión.



¿Fue útil la respuesta?

Agregar a Favoritos Agregar a Favoritos    Imprimir éste Artículo Imprimir éste Artículo

Leer también