Métodos alternativos para prevenir el Spam

Autor/es: Jesús R. Peinado
Ver texto en modo acordeón



Métodos alternativos para prevenir el Spam

cap-gmail-captcha-01

Si pensamos en el spam que nos llega a través de los formularios, nos daremos cuenta de que la cantidad es enorme: formularios de contacto, comentarios, foros, etc. La inmensa mayoría de las veces, la solución para evitar este Spam es usar los famosos Captchas.

Captcha es el acrónimo de "Completely Automated Public Turing test to tell Computers and Humans Apart" (Prueba de Turing pública y automática para diferenciar máquinas y humanos). La típica prueba consiste en que el usuario introduzca un conjunto de caracteres que se muestran en una imagen distorsionada que aparece en pantalla. Y para que engañarnos, son un coñazo. Pero para diferenciar entre máquinas y humanos, y así evitar el spam masivo  en un formulario web hay muchos otros métodos interesantes.

En CSS

El primero de ellos basado en CSS; un robot no visualiza el codigo CSS, por lo que si colocamos un campo como "display: none" (es decir, ya no lo vemos) y nos llega una petición del formulario que haya rellenado el campo invisible, sabremos entonces que es un robot, y por tanto no aceptaremos la petición.

Ejemplo:

En el css: .noshow { display:none; }

En el html

<label for="leaveblank">Leave this blank</label> <input type="text" id="leaveblank" name="leaveblank" /><br /> <label for="dontchange">Do not change this</label> <input type="text" value="http://" id="dontchange" name="dontchange" />

//Si alguno de estos dos campos son modificados, sabremos que es un bot.
En el php:

if ($_POST['leaveblank'] == '' && $_POST['dontchange'] == 'http://') { // accept form submission }

En PHP

También existe un método basado directamente en PHP, siguiendo el mismo modelo. Ejemplo:

En el php:

// You can use the date() function to change field names periodically: // For daily changes, use e.g.: $code = date('Yz'); // Don't copy this 1:1 - adjust the date parameters. (Y:year. z:day of the year) $html = "<input type='text' id='abc$code' name='abc$code' />\n"; if (!isset($_POST["abc$code"]) { // reject form submission }

En la Base de Datos

Existe un método más basado en Bases de datos; que lo que hace es grabar la hora y día en que una ip envía un formulario, evitando que esa ip cargue dicho formulario más de una vez cada dos minutos. Esto evita que no entre en un ciclo de envíos incondicionales, que es al fin y al cabo lo que hace el spam. Ejemplo:

En la base de datos:

CREATE TABLE `spam` ( `ip` int(10) unsigned default NULL, `timestamp` timestamp NOT NULL, KEY `ip` (`ip`));

En el php:

$ip = $_SERVER['REMOTE_ADDR']; // when you reject a form submission: mysql_query("INSERT INTO `spam` SET `ip`=INET_ATON('$ip');"); // whenever somebody opens the page: mysql_query("SELECT `timestamp` FROM `spam` WHERE ip=INET_ATON('$ip') ORDER BY `timestamp` DESC LIMIT 1;"); if (time() - $timestamp < 120) { // 2 minutes // display error message: try again in 2 minutes } else { // display HTML form }

Estos tres métodos son sencillísimos de aplicar y muy útiles. Si aplicáis alguno, ¡contadme que tal va! Fuentes: 1 y 2 Vía 3