Gravatar de Armonth

Sistema antispam del campo oculto para WordPress

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.

Sistema antispam, gráfico by Manz

Manos a la obra

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:

  • /wp-comment-post.php
  • /ruta-a-tu-plantilla/comments.php

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.

Notas al margen

  • 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.

Primeros resultados

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).

35 Comentarios (feed)

  1. Gravatar de Viran Viran nos comenta:

    Prueba Vil sin el campo modificado

    Jueves, 21 de Junio/2007 @ 4:56

  2. Gravatar de Armonth Armonth nos comenta:

    Se me olvidaba una desventaja clara: ya no podremos vacilar de recibir mucho spam (para algunos, el nuevo medidor de popularidad xD).

    Jueves, 21 de Junio/2007 @ 5:03

  3. Gravatar de j_aroche j_aroche nos comenta:

    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

    Jueves, 21 de Junio/2007 @ 5:07

  4. Gravatar de CTX Ken CTX Ken nos comenta:

    Probando los comentarios de SigT xD

    Genial idea, pronto la aplicaré (si es que tengo tiempo y no estoy vago :P).

    Jueves, 21 de Junio/2007 @ 5:11

  5. Gravatar de FrIkI FrIkI nos comenta:

    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.

    Jueves, 21 de Junio/2007 @ 8:27

  6. Gravatar de Reboot Reboot nos comenta:

    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…

    Jueves, 21 de Junio/2007 @ 10:25

  7. Gravatar de David Carrero Fdez-Baillo David Carrero Fdez-Baillo nos comenta:

    Seguro que aprenden a no modificar los campos ocultos :) demasiado fácil, no ?

    Jueves, 21 de Junio/2007 @ 10:50

  8. Gravatar de aNieto2k aNieto2k nos comenta:

    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.

    Jueves, 21 de Junio/2007 @ 11:17

  9. Gravatar de mrg mrg nos comenta:

    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

    Jueves, 21 de Junio/2007 @ 11:21

  10. Gravatar de mrg mrg nos comenta:

    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”

    Jueves, 21 de Junio/2007 @ 11:31

  11. Gravatar de aNieto2k aNieto2k nos comenta:

    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

    Jueves, 21 de Junio/2007 @ 11:37

  12. Gravatar de maty maty nos comenta:

    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).

    Jueves, 21 de Junio/2007 @ 13:10

  13. Gravatar de LinKeR LinKeR nos comenta:

    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

    Jueves, 21 de Junio/2007 @ 14:45

  14. Gravatar de Armonth Armonth nos comenta:

    FrIKI, aNieto2k: no es infalible, pero ayuda a reducir spam (mucho) y recursos consumidos osea que con eso me doy en un canto.

    Como comentan (aunque ya lo había pensado) y dije: a la que contrarresten la medida, se pone otra. En este ejemplo por no complicarlo le he puesto un display none. Pero puedo añadirle un margin -999px (o lo que sea) y ya es bastante más jodido de localizar.

    Es más: acabo de hacerlo y para que “cante menos” lo hago por ID (sin ningún class). Otro método posible es restringir mediante JavaScript y si no se tiene JS activado entonces sí se le pone un captcha matemático. Al menos de momento ha reducido de forma casí total el spam, lo cual da margen a revisar el Akismet en busca de comentarios reales…

    Jueves, 21 de Junio/2007 @ 15:23

  15. Gravatar de Ninio romantico (mi nick xD ) Ninio romantico (mi nick xD ) nos comenta:

    Excelente!!!

    Voy a ver si lo implemento en el proximo rediseño d mi web

    Jueves, 21 de Junio/2007 @ 16:37

  16. Gravatar de corsaria corsaria nos comenta:

    No está nada mal la idea. Para el spam de trackback lo que comenta maty puede ir bien. ;-)

    Jueves, 21 de Junio/2007 @ 18:59

  17. Gravatar de Manz Manz nos comenta:

    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.

    Jueves, 21 de Junio/2007 @ 19:47

  18. Gravatar de Armonth Armonth nos comenta:

    40 horas sin spam + una “oleada” de trackbacks que no llegan ni a 15… un lujo vamos :)

    Viernes, 22 de Junio/2007 @ 14:23

  19. Gravatar de Sergio Sergio nos comenta:

    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

    Sábado, 23 de Junio/2007 @ 0:12

  20. Gravatar de Saiyine Saiyine nos comenta:

    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.

    Lunes, 25 de Junio/2007 @ 0:11

  21. Gravatar de Angeles Angeles nos comenta:

    Mil gracias, ¡funciona!

    Martes, 26 de Junio/2007 @ 8:34

  22. Gravatar de daniel daniel nos comenta:

    Muchisimas gracias, voy a implementarlo de inmediato :D

    pd: odio a los spammers ¬¬

    Domingo, 29 de Julio/2007 @ 1:21

  23. Gravatar de Paranoid Android Paranoid Android nos comenta:

    Me ah funcionado bien!

    Solo que con la actualizacion, pues hay que volver a aplicar el hack.

    Gracias :D

    Miércoles, 8 de Agosto/2007 @ 2:56

  24. Gravatar de Dondado Dondado nos comenta:

    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?

    Lunes, 15 de Octubre/2007 @ 19:36

  25. Gravatar de Armonth Armonth nos comenta:

    Dondado ojo: que muchos comentarios que “se te cuelan” serán trackbacks y no comentarios normales…

    A mí no me ha dado problemas y en cuanto lo del CSS, lo único que deben hacer es recargar una vez o si quieres forzarlo… cambia el nombre del fichero CSS y borra las páginas cacheadas del WP-Cache así si alguno todavía lo tiene en cache lo descargará de nuevo…

    Martes, 16 de Octubre/2007 @ 2:10

  26. Gravatar de Dondado Dondado nos comenta:

    Muchas gracias, parece que va funcionando

    Martes, 16 de Octubre/2007 @ 23:51

  27. Gravatar de Dondado Dondado nos comenta:

    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?

    Domingo, 28 de Octubre/2007 @ 0:30

  28. Gravatar de Armonth Armonth nos comenta:

    Dondado así es, si modificas el wp-comments-post deberás volver a ponerlo a mano, a no ser que el fichero no haya cambiado (rara vez lo hace) de una versión a otra, en tal caso con mantener la versión “retocada” no hay problemas…

    Domingo, 28 de Octubre/2007 @ 20:00

  29. Gravatar de Dondado Dondado nos comenta:

    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)

    Martes, 27 de Noviembre/2007 @ 19:09

  30. Gravatar de javi javi nos comenta:

    He descubierto un plugin que funciona muy bien con esta tecnología. Su nombre es HIDDY. http://hiddy.etechs.it/

    Viernes, 7 de Diciembre/2007 @ 15:40

  31. Gravatar de BJ. BJ. nos comenta:

    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!!

    Sábado, 16 de Febrero/2008 @ 16:33

  32. Gravatar de Armonth Armonth nos comenta:

    BJ si usas WordPress éste envía una serie de emails predefinidos, por ejemplo “Hay un nuevo comentario en tu blog” o “has creado un nuevo usuario”.

    Si envían spam desde tu servidor eso ya es o porque un programa tuyo lo permite directamente o porque ha sido comprometido (aka crackeado) aprovechando algún fallo de seguridad: puede ser un plugin de WP, el propio WordPress, algún otro script o incluso que esté todo el servidor comprometido.

    Así que como verás son tantas las opciones que no puedo ayudarte :\

    Sábado, 16 de Febrero/2008 @ 18:06

  33. Gravatar de fedex fedex nos comenta:

    Muy bueno la verdad… tambien lo comparto desde mi blog para que ayude a otros…

    exitos!

    Jueves, 28 de Agosto/2008 @ 23:37

  34. Gravatar de carlos carlos nos comenta:

    alguien me puede decir
    ¿donde esta wp-cache?

    Jueves, 20 de Noviembre/2008 @ 21:53

  35. Gravatar de Dondado Dondado nos comenta:

    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

    Miércoles, 10 de Diciembre/2008 @ 0:30

Comentarios cerrados