Banear mensajes por palabras clave.

Resumen.

La lucha contra el spam es una lucha casi interminable, y no son pocos los que eliminarían el “casi”. Ya hemos tratado en otros artículos este problema, ahora vamos a presentar otro método para hacerle la vida mas complicada a los spamer. Vamos a presentar un método para bloquear mensajes según unas ciertas “palabras claves”, o mas bien cadenas de texto. Según aparezcan o no estas cadenas de texto, los mensajes serán o no permitidos. ¿Complicado?, nooo, muy fácil, vamos al lío.

Artículo.

Ya hemos hablado en otros artículos como montar sistemas antispam con captchas y bloqueos de direcciones IP, son métodos muy buenos de lucha contra el spam, pero como todos sabemos, se quedan cortos muchas veces. En este artículo vamos a ser mas contundentes, vamos a bloquear mensajes por “palabras clave”, o mas bien, cadena de caracteres, y cuando digo cadena de caracteres, me refiero a que podremos bloquear lo mismo una dirección IP, como una dirección de e-mail, como la URL de un sitio Web, o el nombre del remitente.

Si examinamos cualquier mensaje de spam, todos tienen algo en común, todos te dirigen a una Web de interés para los spamers, pues bien, podemos tomar esa Web “https://www.webspam.com” como criterio para bloquear mensajes.

La lógica del procedimiento que vamos a seguir es muy sencilla, vamos a partir de los campos típicos que recogen cualquier formulario de contacto: nombre, e-mail, IP, asunto y mensaje.

Pues bien, todos estos campos los vamos a agrupar en una misma variable:
$texto = $nombre.$email.$ip.$asunto.$mensaje;
Con esto ya tenemos toda la información disponible para decidir el criterio de bloqueo. Vamos a un caso práctico de ejemplo.

Tras un mes recibiendo dos o tres mensajes diarios 6 días a la semana desde diferentes direcciones IP donde me envían a la URL

https://www.webspam.com/?id=artesaniaweb

donde un tal señor John Smith me cuenta lo maravilloso y coste reducido de los servicios que prestan, llego a la conclusión de que este señor es mas pesado que un dolor de muelas en un día de menstruación dolorosa y además un funcionario del juzgado me informa que mi casa va a ser embargada en las próximas 48 horas por el acumulado de multas de aparcamiento que tengo.

Con esto, decido que el bloqueo del dominio “webspam.com” es lo más adecuado. Pero este dominio me aparece simplemente como un enlace a esa Web, ¿cómo hago para detectar este nombre de dominio?

La respuesta está en la siguiente sintaxis:
<?php // Buscamos valores de array en un texto $texto 'Greetings! My name is John Smith and I would like to introduce you to our method to multiply your  website traffic consisting of blah, blah, blah, and rebla… To do this you only have to join our program at the following URL https://www.webspam.com/?id=artesaniaweb Today is a big day for you. tradingjohnsmith@webspam.com 114.119.157.250'; $busca = array('114.119.157''tradingjohnsmith''webspam.com');     foreach($busca as $key => $termino){         if (preg_match("/$busca[$key]/i"$texto)){             // El termino existe en el array, SPAM             $Es_Spam $busca[$key];         }      }     $n_spam strlen($Es_Spam); echo '<p>Aqui podria ir el resto del codigo que envia el mensaje de nuestro formulario de contacto.</p>'; ?>
Vamos a desgranar un poco este código. La variable $texto recoge todos los datos del típico mensaje spam, seguro que a mas de uno le suena este tipo de mensaje. Seguidamente, en la variable tipo array $busca hemos introducido unos términos que nos van a permitir bloquear este mensaje. Por supuesto, en esta parte tenemos que ser muy cuidadosos con no introducir términos demasiado genéricos, ya que entonces podríamos bloquear mensajes que no deberíamos bloquear. Así, si en cualquier mensaje llega cualquiera de estos valores, el mensaje será bloqueado.

A continuación, mediante un bucle foreach, una estructura condicional if y la función preg_match() buscamos los diferentes valores del array en el texto, si existe solo uno de ellos, mediante strlen() contamos el número de caracteres, y si es mayor que cero, el mensaje no se enviará nunca. Si no se encuentra ninguno de los valores contenidos en el array, el valor de $n_spam será 0 y el mensaje será enviado.

Para facilitar la aplicación de este código a nuestra aplicación de contacto, lo podemos convertir en función de la siguiente manera:
<?php // Buscamos valores de array en un texto function AntiSpam($texto$busca){     foreach($busca as $key => $termino){         if (preg_match("/$busca[$key]/i"$texto)){             // El termino existe en el array, SPAM             $Es_Spam $busca[$key];         }      }     @$n_spam strlen($Es_Spam);     return $n_spam;  } // Aplicamos la funcion $email 'tradingjohnsmith@webspam.com'; $texto 'Greetings! My name is John Smith and I would like to introduce you to our method to multiply your  website traffic consisting of blah, blah, blah, and rebla… To do this you only have to join our program at the following URL https://www.webspam.com/?id=artesaniaweb Today is a big day for you. tradingjohnsmith@webspam.com 114.119.157.250'; $bloquear = array('114.219.157''trading-johnsmith''webspam.com'); $spam AntiSpam($texto$bloquear); if($spam 0){     // Existe Spam     $email null;     $aviso "SPAM en termino de $spam caracteres"; }else{     // NO existe Spam     $aviso 'Envio OK'; } echo "<p><b>$aviso</b> Aqui iria la validacion, y dado que el email ha sido declarado como null,  no se superaria la validacion y el mensaje no se enviaria. -- <b>$email</b> -- <br />Como puede verse el email no se muestra ahora en pantalla. </p>"; ?>
Por supuesto, lo mas cómodo seria guardar los valores de la variable $bloquear en una base de datos, ya que obtener un array a partir de ella es muy sencillo, tan simple como recuperar una columna. La validación ya la vimos en un artículo publicado anteriormente.

Y esto es todo amigos, este es mi último “truco” para bloquear el temido y odiado SPAM.
Tags: Banear || spam || función || mensaje

Comentarios.

Sin comentarios, publica el tuyo.