11 de Enero, 2005

Spam en los comentarios

No tengo :o.

Vale, vale. Esta bitácora no es popular. A poca gente le interesan los rollos de la muerte que escribo por aquí. Pero bueno, voy a ir explicando alguna técnica que tengo implementada en este CMS para prevenir esa cosa tan desagradable que es el spam en los comentarios.

En primer lugar hay que entender que es un problema muy complejo. Queremos evitar que nos pongan comentarios fuera de tema (igual sí hay bitácoras en las que el spam en los comentarios sea buena cosa :P), lo que es casi lo mismo que decir que no queremos que nos pongan comentarios, aunque deseamos recibir comentarios. Es decir, por muchas teorías que llevemos a la práctica siempre habrá un punto débil: si permitimos poner comentarios, se podrán poner comentarios :) (por ejemplo, un spammer a mano con mucha paciencia). Una vez asumamos este punto ya podemos calentarnos la cabeza en poner trabas, recordando que en el fondo no sirve de nada.

Bueeeno, sí sirve. Al menos contra los bots (parece que hablando de redes suena feo decir robot, aunque esa sea la palabra), sí tendremos una oportunidad. Lamentablemente siempre contaremos con una premisa, que siempre será incómoda para el usuario.

En mi caso propongo un sistema que requiere que el navegador del cliente acepte cookies, y además limitará un poco la navegación por la bitácora (concretamente puede condicionar la forma de poner comentarios; explico más abajo). La fuerza del invento reside en esperar que el bot no tenga implementada características que sí tienen disponibles los navegadores reales.

Tampoco sé hasta que punto esta idea es efectiva, sobretodo porque la vengo usando desde hace más de un año y no sé en realidad si no tengo spam porque no tengo o porque el sistema funciona. En cualquier caso, aquí vamos :).

Hay que iniciar una sesión cuando se muestra el formulario que va a hacer el envío del comentario. Cuando se genera ese formulario ya sabemos a qué anotación va a ir dirigido el comentario, y vamos a hacer que la página que lo procese obtenga ese valor de la sesión.

Esto implica que el bot sabe procesar cookies, es decir, que a guardado el identificador de la sesión que envía PHP y luego sabe mostrárselo a la página que publica el comentario.

Además tenemos que tener en cuenta que para ese navegador probablemente solo habrá una sesión, así que de alguna manera habrá que identificar que el ID de la anotación guardado en la sesión corresponde con el formulario que envía el comentario.

Por supuesto podríamos emplear el mismo ID, pero entonces estaríamos en la mismas :P. Para ello usamos un valor pseudo-aleatorio.

session_start();

/* cogemos el id para el cual generamos el formulario */
$m_id=$_GET['id'];
settype($m_id,"integer");

/* se hace lo que sea que tengamos que hacer y justo antes
 * de publicar el formulario... generamos la variables mágicas */
$_SESSION["form_key"]=md5(time());
$_SESSION["id"]=$m_id;
?>

<form id="comentario" method="post" action="comentario.php">
<div>
autor:<br />
<input type="hidden" name="form_key" 
 value="<? echo $_SESSION["form_key"]; ?>" />
<input type="text" name="autor" value="" /><br />
<br />
url/mail:<br />
<input type="text" name="url" value="" /><br />
<br />
título:<br />
<input type="text" name="titular" value="" /><br />
<br />
comentario:<br />
<textarea name="comentario"></textarea><br /><br />
<input type="submit" value="enviar" />
</div>
</form>
<?

/* en el comentario.php */
session_start();

if($_POST["form_key"]!=$_SESSION["form_key"])
	die("Invalid form_key!");

/* y en $_SESSION["id"] tenemos el id de la anotación */

Estas cosas prefiero explicarlas más que poner código, porque resulta completamente inútil. Pero bueno, como luego resulta molesto que mucha gente pida el código sin intentar entender la explicación, ahí queda. Espero que se cumplan las sencillas condiciones de copia de este humilde sitio :P.

Más o menos ya se pueden intuir las consecuencias de esto. Si el bot no gestiona adecuadamente el cookie se dará de narices con un Invalid form_key!, al igual que muchos otros usuarios que tengan ojeando varias anotaciones en la misma sesión :|.

Esa es la principal incomodidad para los clientes legítimos (véase no bot). El último formulario que carguemos será el que deje su huella en la sesión y marque qué anotación debe recibir el comentario. No me parece un problema terrible, aunque creo que alguno ha sufrido por aquí algún Invalid form_key! :P.

Y esto es todo. Además tengo en cuenta algunos detalles, como que los nombres de las páginas no sean muy obvios (aun así me despisté con el print.php y le meten caña a saco :S) o verificar que pasan al menos 60 segundos entre comentarios desde una misma IP.

A ver si alguien que sufra el spam en los comentarios se anima a probar la idea y nos cuenta que tal le va.

Anotación por Juan J. Martínez, clasificada en: php, blog.

Hay 5 comentarios

Gravatar

Vale, vale. Esta bitácora no es popular. A poca gente le interesan los rollos de la muerte que escribo por aquí.

La popularidad y el exito en el mundillo "bitacorero", como sucede en el "mundo real", no suele ir asociado a la calidad de los contenidos.

Personalmente, considero que la mayoria de tus "rollos de la muerte" son muy interesantes. Canela fina, vaya.

Los que te leemos todos los dias seremos pocos, pero muy aguerridos. Mejor así.

¡Animo! ;-)

por roberto, en 2005-01-12 20:53:31

Gravatar

Voy a llorar de alegría donde nadie me vea :D.
En serio, muchas gracias.

por Juanjo, en 2005-01-12 21:17:27

Gravatar

Es que tus post tienen mucho nivel. Sigue así.

por Goatse, en 2005-01-13 00:34:23

Gravatar

Totalmente de acuerdo con roberto, hay pocas bitácoras dedicadas a estos temas que a muchos de nosotros nos apasionan.

El esfuerzo y la claridad con la que intentas exponer todos tus rollos para que cualquier lector sea capaz de sacar alguna conclusión al final del texto hacen que esta web sea muy interesante.

Por cierto, ya te contaré cuando tenga tiempo libre como fue el tema antispam en mis comentarios :).

por r0sk, en 2005-01-13 16:42:34

Gravatar

Yo he leído varios posts y me resultan interesantes. Tal vez tengan cierto nivel pero son de los que incitan a investigar más lo que propones. :)

por corsaria, en 2005-01-17 22:33:16

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: