Publicado el Jueves 21 de Junio del 2007 @ 4:37 por Armonth.
Hace tiempo Manz de Emezeta comentó una táctica poco usada pero que suele ser bastante efectiva para desechar el spam: el campo oculto.
No hace mucho me puse en contacto con Manz para tratar el tema, estaba vago y no quería romperme la cabeza implementando algo: give me the source (o algo así…) pero al final por falta de tiempo ni él me mostró el código para implementarlo ni yo me puse a mirar cómo hubiera podido hacerlo. En cualquier caso la idea está en el post mencionado de Manz, yo ahora voy a decir qué código tocar en WordPress.
La idea es duplicar el campo de autor para que el spammer ponga su nombre (siempre cambian el campo del nombre, al igual que los usuarios) pero vamos a hacer que ese campo de más no sea leído por los lectores mediante CSS. Para ello nada mejor que robarle el gráfico:
El truco del sistema antispam reside en que los spammers, por naturaleza, cambian todos los campos llamados comment, comentario, name o nombre por la publicidad que quieren hacer. ¡Perfecto! Ellos mismos han caído.
En WordPress tenemos cuatro campos por defecto: author (nombre de usuario), email, url y comment (contenido del comentario). El único que nos interesa es el author.
Primero haremos copia de seguridad de los dos siguientes ficheros:
Una vez hecho esto, abrimos el fichero comments.php y donde pone:
<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" tabindex="1" />
Copiamos la línea, en la primera línea quitamos el contenido de value=”" y lo dejamos como “author” añadiendo la clase hid y en la segunda cambiando “author” por “nombre” quedando así:
<input type="text" name="author" id="author" class="hid" value="author" tabindex="1" />
<input type="text" name="nombre" id="nombre" value="<?php echo $comment_author; ?>" tabindex="2" />
Ya que estamos creamos la clase “hid” en el fichero style.css:
.hid { display: none; }
Turno para el wp-comments-post.php, buscamos el siguiente código:
$comment_author = trim($_POST['author']);
$comment_author_email = trim($_POST['email']);
$comment_author_url = trim($_POST['url']);
$comment_content = trim($_POST['comment']);
Y lo cambiamos por:
$comment_author = trim($_POST['nombre']);
$comment_fake_author = trim($_POST['author']);
$comment_author_email = trim($_POST['email']);
$comment_author_url = trim($_POST['url']);
$comment_content = trim($_POST['comment']);
Ahora, si os fijáis, los datos del comentario se rellenan con el contenido del input “nombre” y guardamos el contenido del input oculto atrapa-spammers (”author”) como $comment_fake_author.
Ahora toca que si un comentario envía el input “author” con un value=”" distinto a “author” (o lo que nosotros queramos pero que coincida con el valor por defecto del input oculto en el comments.php) sea descartado por spammer. Buscamos:
if ( '' == $comment_content )
die( __('Error: please type a comment.') );
Y añadimos debajo:
if ( 'author' != $comment_fake_author ) // Es spam
die('¿Donde vas?');
El mensaje obviamente es personalizable, yo aquí he puesto un Quieto parado, cowboy. este mensaje (en inglés obviamente) es lo que decia WordPress antes cuando comentabas muy rápido y es lo que dice menéame cuando meneas demasiado.
Por último existe un problema: los usuarios registrados por defecto envían su nombre sin el falso campo, por lo que volvemos un poco más atrás en el código y vemos esto:
if ( $user->ID ) {
$comment_author = $wpdb->escape($user->display_name);
Pues justo debajo añadimos:
$comment_fake_author = "author";
Y solucionado.
Importante: borrad la cache (wp-cache) después de los cambios, de lo contrario la gente enviará comentarios usando los datos del viejo formulario (sin el value=”author”) y no podrán enviar nada.
El sistema oculta el campo mediante CSS: si por una casualidad el lector no usa CSS verá el campo y puede rellenarlo (por tanto: provocar el error). Por suerte esto es poco probable y se puede solucionar con una nota (oculta también).
El sistema es una especie de captcha no intrusivo: no impide el spam manual, sólo se aprovecha de la “estupidez” de los bots de los spammers por lo que un comentario de spam manual entrará: esto sirve para desatascar akismet y que siga filtrando el spam (el cual puede dar falsos positivos).
Obviamente, esto no impide el spam mediante trackbacks.
Desde que lo he implementado han aparecido en el akismet 2 comentarios pero creo que ya estaban antes. Lleva varias horas sin un comentario de spam cuando mi media diaria supera los 20 por hora (+ de 500 al día).
Manz ya aseguró en su momento (y sigue hasta ahora) que desde que lo implementó no se le ha colado ni uno salvo los comentarios hechos manualmente (los cuales son indetectables).
Prueba Vil sin el campo modificado
Yo he estado tentado ha hacer eso, o ha reemplazar los nombres de los campos de texto a unos menos obvios para los spammers. Creo que este método es más efectivo. Prefiero dejar de decir “Recibo 1800 mensajes spam por día” y tener el servidor menos cargado.
PD: Para los que naveguen con Lynx, habrá que dejarles algún mensaje para que no modifiquen el campo xD
Probando los comentarios de SigT xD
Genial idea, pronto la aplicaré (si es que tengo tiempo y no estoy vago :P).
Recomiendo meter información sobre la ip del visitante en el campo oculto y comprobar que se envia el comentario des de la ip “correcta”, así vas a cazar algunos más.
El sistema que propones no es infalible, algunos spammers se van a saltar esa protección, en bulma.net puse algo así hace una semana y al dia siguiente ya se la habian saltado.
Joder, ¡qué buena idea!
Pero ¿y lo que mola haber programado un captcha casero…? Si es que no tenemos caridad ya para los programadores retirados…
Seguro que aprenden a no modificar los campos ocultos :) demasiado fácil, no ?
xDDDD
Pero… el robot de SPAM solo tendría que buscar los inputs ocultos y no rellenarlos no?
Le veo poco futuro a esta solución…
var s = document.styleSheets[1].cssRules;
var i = document.getElementsByTagName("input");
for (var x =0; x < i.length; x++) {
var actualiza = "N";
var reg = new RegExp(i[x].className, "i");
for (var y=0; y < s.length; y++) {
if(i[x].style.display != 'none' && i[x].className != '') {
if (reg.test(s[y].cssText) && s[y].style.display != 'none') actualiza = "S";
} else actualiza = "S";
}
if (actualiza == "S") i[x].value = "SPAM";
}
Prueba esto en Firebug, si se aplica a un lenguaje de servidor ya no sirve el método.
según lo que comenta anieto2k, se podría mejorar la técnica dejando fuera de la pantalla el campo, más que dejándolo oculto, con eso le pondríamos las cosas más difíciles
puestos a hacer la puñeta a los spammers, una idea más, dejar fuera de pantalla el campo BUENO, (¿el más típico es “email”?), y dentro de pantalla poner “fakemail”, si nos han rellenado el campo “email” de todas todas, es un spammer. Si no, basta con copiar “fakemail” a “email”
La única solución real, es molestar al usuario con una pregunta, un captcha o algo visual que el usuario pueda ver, pero no un robot…
Lamentablemente, no hay otra manera, aunque estoy de acuerdo en que la de Manz por el momento es factible y muy cómoda.
Saludos
O vista previa obligatoria.
Otro problema, que aparece de vez en cuando, es el spam vía trackbacks. Finalmente, días atrás opté por modificar el fichero, para evitar el spam. Y funciona bien (Una temporada en el infierno).
Lo que es un error es dejar que Akismet se encargue de todo. Cuanto menos trabaje mejor, menor carga de CPU en el servidor web compartido. Si se recibe mucho spam, la reducción del consumo es drástica (en la bitácora anterior es 30 veces menor que antes de implementar la protección antispam en los comentarios y el trackback vía plugins -antes de modificar el fichero).
Esto es venido del cielo, puesto que no puedo utilizar ningún plugin antispam por el uso execivo de recursos que este genera en mi host, ya estaba chato de moderarlos manualmente.
me alegro el dia la noticia
saludos
Excelente!!!
Voy a ver si lo implemento en el proximo rediseño d mi web
No está nada mal la idea. Para el spam de trackback lo que comenta maty puede ir bien. ;-)
Me alegro de que te funcione. Ya digo, a mi hasta el día de hoy, no me llega ningún spam, salvo los manuales.
Muchas gracias por el hack , lo he adaptado para lightpress y va perfecto , me has salvado de estar borrando a mano más de 100 spams diarios .
un saludo crack
Vaya hombre, pensaba que solo se me habia ocurrido a mi.
Lo llevo usando un par de años en mi página y funciona de muerte.
Mil gracias, ¡funciona!
Muchisimas gracias, voy a implementarlo de inmediato :D
pd: odio a los spammers ¬¬
Me ah funcionado bien!
Solo que con la actualizacion, pues hay que volver a aplicar el hack.
Gracias :D
Lo he puesto y algunos se me cuelan, más o menos la mitad que antes, además he tenido un problema: se me han quejado algunos visitantes de que no podían poner comentarios (les contestaba que eran spammers) y les aparecían los dos cajetines, por lo que cuentan parece que no habían refrescado el CSS ¿se puede forzar a que en la siguiente visita se recargue el CSS?
Muchas gracias, parece que va funcionando
Funciona de maravilla, pasados unos días, no he vuelto a tener ni un sólo spam. Supongo que cada vez que se actualiza el wordpress (al menos el wp-comments) habrá que volver a meterlo a mano ¿no? o ¿hay alguna forma de automatizar esto que a mi se me escapa?
Qué lástima, ya me han pillado. Ha funcionado de vicio durante algo más de un mes pero ya estoy otra vez con 3 ó 4 mensajes diarios. Habrá que estrujarse un poco más la cabeza ¿qué tal hacer una rutinilla en javascript que devuelva un valor?
Ventajas: los bot traen el javascript activado, les cazas a todos
Desventajas: no podrá dejar un comentario nadie que traiga el javascript desactivado, como por ejemplo todos los que usamos NoScript (salvo que sean webs de la lista blanca)
He descubierto un plugin que funciona muy bien con esta tecnología. Su nombre es HIDDY. http://hiddy.etechs.it/
hola! interesante, pero tengo una preguntota, ando buscando como evitar que envien spam desde mi sitio web, es decir, me han enviado mails diciendo que por que les mando spam, peor yo no hago nada de eso, y hoy me llego un correo de mi propio sitio vendiendome viagra y cialis…. ni al caso, en fin, consegui un codigo pero no se donde ponerlo en el index, : if (strtolower(substr($_POST[’pag’],0,5))==’http:’ or
strtolower(substr($_GET[’pag’],0,5))==’http:’) return;
tambien uso el wordpress, y tengo varios sitios, y me gustaria evitar que se envien correos desde mi sitio o de cualquiera de ellos, por que aparte se me satura mi cuenta con los correos no devueltos, la semana pasada en una de las cuentas tenia mas de 1250 correos devueltos en 4 dias…. ya me enfade!!
en fin, si tienes forma de ayudarme, te lo agradecere, enviame un mail por favor! ahi se queda mi direccion. Gracias!!
Muy bueno la verdad… tambien lo comparto desde mi blog para que ayude a otros…
exitos!
alguien me puede decir
¿donde esta wp-cache?
En WP 2.7 hay algunos cambios en el wp-comments-post, estaría muy bien que revises si le afecta en algo aunque a priori parece que vale todo tal y como está.
Un saludo