Comunidad de diseño web y desarrollo en internet online

Lucha contra el SPAM, comprobaciones en mail() de PHP

Citar            
MensajeEscrito el 15 Dic 2005 04:21 pm
A ver... Me llegó esto hoy, de parte de los dueños de mi servidor y me ha parecido importante, y por eso ha venido a parar acá. No sé si amerite un tutorial o algo o si de verdad es tan importante. Pero eso me ha parecido.

Le hacemos llegar este anuncio para informarle sobre el creciente uso de una nueva modalidad de envio de e-mails masivos a través de formularios web que utilizan PHP para el envio de mails con el objetivo de enviar spam, en algunos casos, y el anonimato de los mensajes enviados en otros caso. Esta modalidad aprovecha la forma en que la función mail() de PHP funciona y se conoce como "Headers Mail Injection". La misma consiste en aprovecharse de formularios de sitios web que utilicen la función mail() de PHP para el envio de los datos ingresados por el visitante y que además estos, no validen los datos en forma correcta para evitar este tipo de abusos.


¿Cómo funciona esta modalidad?
Para explicarlo vamos a basarnos en un ejemplo simple, supongamos que nuestro sitio dispone de un campo para el ingreso del e-mail por parte del visitante de la siguiente forma:

<input name="email" type="text" value="Ingrese su e-mail aqui" />

luego, la dirección ingresada en este campo es enviada al servidor y es tomada por el script PHP para ser utilizada como FROM en la función mail() y de esta manera el mensaje que nos llega a nuestro correo tendrá como remitente la dirección ingresada por el visitante. Ahora bien, la función mail() de PHP

mail(recipiente, asunto, mensaje, cabeceras extras);

simplemente concatena los parametros que le son pasados, por lo cual, si en el campo mail del formulario ingresamos lo siguiente:

"[email protected]%0ACc:[email protected]%0ABcc:[email protected],[email protected]"

donde la primera dirección será el FROM: (dirección de origen que llegará a las víctimas del spam), %0A es el valor hexadecimal del caracter de salto de línea <LF>, Cc: (Copias) contiene la dirección o direcciones de las víctimas y Bcc: (Copias ocultas) contiene también direcciones de las víctimas del spam.

Parte de la cabecera del e-mail generado por nuestro formulario abusado será:

To: [email protected]
Subject: Asunto del mensaje
From: [email protected]
Cc:[email protected]
Bcc:[email protected],[email protected]

Con esto, el spammer habrá utilizado nuestro formulario para el envio de correo masivo a través de nuestro formulario.

El ejemplo visto es el caso más básico de esta modalidad ya que a través de la inyección de cabeceras se puede incluso modificar el asunto y hasta el mensaje en si mismo hasta el punto de poder enviar mensajes con contenido html.


¿Qué consecuencias tiene esta modalidad?
En primer lugar, nuestro formulario está siendo usado para llevar a cabo un acto con el cual la gran mayoría de nosotros estamos en desacuerdo, también se está haciendo uso del ancho de banda disponible para el servidor afectando al resto e los sitios alojados en el mismo, por lo cual, el sitio en cuestión será suspendido hasta que el inconveniente sea resuelto, por último, ante una denuncia de spam, dicha cuenta deberá ser suspendida de acuerdo a lo previsto en legales de nuestro sitio. Es responsabilidad de cada usuario el utilizar código lo suficientemente seguro en su sitio web y corregir esto si fuera necesario.


¿Cómo evitar la utilización de nuestro formulario?
Ante todo, cabe aclarar que esta modalidad se da únicamente en formularios que utilizan la función mail() de PHP para procesar y enviar los datos ingresados por el visitante.

Si utiliza algún script de PHP no elaborado por Ud. como formailphp, por favor, actualice el mismo con la versión más reciente verficando que brinde una solución a este tipo de actividad.

Si utiliza un script PHP creado por Ud. o posee los conocimientos como para editar el mismo, aquí incorporamos una función que puede utilizar para validar los datos ingresados de forma eficiente.

Código :

<?php
  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;
      }
    }
  }

  //Ejemplo de llamadas a la funcion
  ValidarDatos($_POST['email']);
  ValidarDatos($_POST['asunto']);
  ValidarDatos($_POST['mensaje']);
?>

Esta función es básica y puede ser modificada de acuerdo al script que Ud. utilice para el procesamiento del formulario e incluso incorporar control de errores.
No olvide incluir los campos ocultos del formulario si estos datos van a ser pasado a través de la función mail().

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox
Citar            
MensajeEscrito el 16 Dic 2005 05:20 pm
mmm interesante, pregunto, no sería más fácil, recorrer la cadena hasta el primer punto + 8 (por aquello de los .info, .com.mx, etc.) y sólo tomar eso como base para el envío? y en los demás usar el hack para evitar la inyección de código que ya conocemos??

Por Aoyama

BOFH

6224 de clabLevel

6 tutoriales
12 articulos

Genero:Masculino   Anime Bloggers Bastard Operators From Hell

Webdesigner & Developer, en mis ratos libres bebo café por litros.

firefox
Citar            
MensajeEscrito el 17 Dic 2005 08:41 pm
no usaras datattec? :lol: a mi tambien me llego

Por asc1

88 de clabLevel



Genero:Masculino  

Peru .....

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.