Gravatar de Armonth

WordPress, spam y algunas medidas activas contra él

Existen cuatro palabras mágicas que, conociendo las, pueden usarse para ayudarte a romper los cuernos de algún que otro spammer. Estas palabras son: Akismet, Bad Behavior, .htaccess y wp-comments-post.php.

Hoy quiero hablar un poco del spam, cómo se divide y de las dos últimas palabras.

Introducción

El spammer necesita de un vector de entrada, es decir, una vía por la cual introducir sus “productos” en la base de datos y de ahí llegar al usuario final. Al menos de momento los métodos relacionados al cracking como reventar la contraseña e introducir directamente las entradas no es algo que se practique, por pura cuestión de tiempo: se gasta demasiado tiempo en adivinar la contraseña.

Por ello el vector utilizado es el del formulario para comentar en el blog, las medidas para filtrar el grano de la paja o comentarios normales y spam suelen dividirse en dos: Activas y Pasivas.

Las medidas pasivas consisten en, una vez recibido todos los comentarios, filtrar lo que es spam y lo que no. Realmente no es una solución: el gasto en CPU y otros recursos sigue ahí e incluso se incrementan por culpa de los filtros para determinar si es spam o no.

Las medidas activas en cambio son aquellas hechas para evitar que el spam llegue siquiera a intentar escribirse en la base de datos. La mayoría de medidas no encajan del todo en una u otra definición y a menudo son mixtas, volviendo a las palabras mágicas veamos que hacen cada una:

  • Akismet es una medida pasiva al 100%: una vez llega el comentario lo filtra según sea spam o no. Si bien tiene la ventaja que los gastos de recursos no te los comes tú si no un servidor de terceros. Y si éste servidor queda saturado, pues pasan todos a moderación.
  • Bad behavior es una medida mixta: intercepta cabeceras HTTP, comportamientos sospechosos y llegados el caso impide que se haga el comentario. Hay un gasto en CPU al monitorizar la actividad pero un ahorro al impedir que el spam se inserte.
  • htaccess y wp-comments-post son sendas medidas activas: son medidas que aplicamos e impiden el acceso.

La idea de las dos últimas opciones es reducir lo máximo posible el spam que entra para que Akismet no tenga que filtrarlo, si bien su nivel de acierto es muy pero que muy alto, a veces se equivoca.

Scripts y spam en WordPress

El spam interactúa con nuestro formulario e intenta explotarlo de la forma más sencilla posible para insertar la cantidad más grande de spam posible en el menor tiempo y con el mínimo tiempo de recursos.

Los spammers tienen tanta cara que no les importa gastar tu tiempo y recursos pero sí les molesta gastar el suyo y quieren maximizar las ganancias.

Por eso, al utilizar un CMS cómo WordPress, se aprovechan de que un gran % de los blogs usamos está plataforma para preparar scripts personalizados enfocados a detectar la plataforma usada.

Los scripts se enfocan de dos maneras distintas:

  • Enfocado al formulario: analizan la web, interpretan el formulario y lo utilizan.
  • Enfocado a la plantilla: utilizan los parámetros por defecto del CMS para facilitar la tarea de enviar spam y ahorrar costes.

Los spammers que usan scripts del primer tipo nos tienen bien jodidos, pocas medidas podemos aplicar salvo — quizá — banear los PCs zombies pero es una batalla a la larga perdida.

Los que usan scripts del segundo, por suerte, son mayoría a día de hoy, algunos más ingeniosos a la que detectan variaciones de la plantilla dejan el segundo método para pasar al primero, pero son los menos.

Entonces lo que podemos hacer es tres cosas:

  1. Variar la plantilla.
  2. Introducir “honeypots”.
  3. Impedir el acceso al “wp-post-comments” a terceros.

Medidas: Variar la plantilla e introducir “honeypots”

Esta medida fue bastante popular hace un tiempo, consiste en editar el fichero comments.php dentro de tu plantilla y donde pone:

action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php"

Cambiar wp-comments-post.php (el fichero que se encargá de procesar los comentarios) por algo aleatorio, luego se debe cambiar el nombre del fichero por ese “algo”.

Con esto, todos los scripts que se basan en buscar el fichero wp-comments-post.php fallarán, pero no vamos a limitarnos sólo a eso ¿verdad?…

Muchos scripts a la que detecten que no existe el fichero wp-comments-post.php intentarán detectar el nuevo nombre del fichero pero hay una solución: mantener un fichero wp-comments-post.php falso

Aquí entra la pericía de cada uno como programador, podemos dejar el fichero en blanco o introducir un script que, consumiendo lo mínimo posible, tienda una trampa o Honeypot al spammer para hacerle creer que el comentario (sea moderado o no) se ha introducido correctamente.

Los que usen el formulario desde la web no notarán la diferencia, los que envían spam directamente al formulario tampoco, pero tú sí.

Medidas: impedir el acceso al “wp-post-comments” a terceros

Pero todavía puede ser uno más retorcido, a diferencia de los usuarios normales, muchos scripts para enviar spam lo que hacen es introducir directamente los datos al fichero que procesa las peticiones, en este caso wp-comments-post.php o el nuevo nombre que hayamos introducido.

Por ello, podemos escribir unas reglas sencillas mediante .htaccess que impidan acceder a terceros a esos ficheros, aunque tú envies un comentario, es el servidor web el que envía ese comentario al fichero wp-comments-post.php por eso merece la pena impedir el acceso de ese fichero a terceros:

 RewriteCond %{HTTP_REFERER} "!^http://sigt.net/.*$" [NC]
 RewriteCond %{REQUEST_URI} ".*nuevo-comments-post.php$"
 RewriteRule .* - [F]

La regla es simple, si no es http://sigt.net quien envía el comentario al fichero wp-comments-post.php renombrado pues aborta el proceso.

Una cosa importante: tened cuidado con las www la regla es para que solamente “http://sigt.net” y urls internas que cuelguen del mismo puedan acceder al fichero. Eso quiere decir que si permites el acceso desde tudominio.tld y www.tudominio.tld estarás impidiendo comentarios legitimos en una de las dos versiones.

Para evitar esto y para evitar que los buscadores te posicionen incorrectamente, evita las urls canonicales.

Resultados a día de hoy

De media, Akismet filtra 220 comentarios diarios como spam y de ellos muy de vez en cuando uno o dos no son spam.

En la semana que llevo con las medidas aplicadas la media ha bajado a menos de la mitad, no es la solución definitiva pero permite descongestionar la cola de spam de Akismet.

12 Comentarios (feed)

  1. Gravatar de guillem guillem nos comenta:

    El Akismet no me iba fino porque tengo muy capado el Apache, en un chroot dentro de una máquina virtual tras dos niveles de firewalls (no, no es broma). Lo de conectarse desde PHP hacia fura no andaba ni p’atrás y no es fácil hacerlo funcionar sin abrir más de lo que estoy dispuesto a abrir O:-)

    Yo en root.cat me he puesto un captcha y la aprobación del primer comentario (con nombre y email privado) como condición. La verdad es que no se me ha colado ni un solo spam de las docenas que han intentado meterme… aunque posiblemente mi casi nula importancia ayuda bastante :-P

    Lo que me consta es que todo el mundo piensa que lo del captcha es una patada en las partes X’-D

    Miércoles, 10 de Enero/2007 @ 22:26

  2. Gravatar de Armonth Armonth nos comenta:

    Y lo es guillem, al menos a nivel de usabilidad… aunque hoy he visto un captcha realmente “ingenioso” que (sin pensar que muy seguro no debe ser) se trata básicamente de letras generadas usando asteriscos “*” como si de un figlet se tratará:

     **      **  **    **  **         ********   *******
     **  **  **  ***   **  **    **      **     **     **
     **  **  **  ****  **  **    **      **            **
     **  **  **  ** ** **  **    **      **      *******
     **  **  **  **  ****  *********     **            **
     **  **  **  **   ***        **      **     **     **
     ***  ***   **    **        **      **      *******
    

    Miércoles, 10 de Enero/2007 @ 22:31

  3. Gravatar de Moi Moi nos comenta:

    Estupendo articulo el que has escrito, me ha gustado sobre todo el pequeño truco que realizas para redireccionar el wp-comments-post.php dependiendo el origen del acceso.

    Jueves, 11 de Enero/2007 @ 11:20

  4. Gravatar de corsaria corsaria nos comenta:

    Esto corrige esto:

    “para evitar que los buscadores no te posicionen correctamente”

    Será…

    “para evitar que los buscadores te posicionen incorrectamente”

    Ese “evitar” + “no te posicionen” puede dar a entender lo contrario de lo que deseas explicar. ;-)

    Por lo demás una buena entrada. :-)

    Sábado, 13 de Enero/2007 @ 18:07

  5. Gravatar de Armonth Armonth nos comenta:

    Hecho…

    Sábado, 13 de Enero/2007 @ 18:49

  6. Gravatar de Motarile Motarile nos comenta:

    Excelente artículo. Claro y conciso.

    Enhorabuena.

    Martes, 16 de Enero/2007 @ 17:36

  7. Gravatar de eCCe eCCe nos comenta:

    Muy útil, Gracias!

    Jueves, 25 de Octubre/2007 @ 11:30

  8. Gravatar de Pili Pili nos comenta:

    Me parece muy interesante este post y voy a poner en practica lo de renombrar el fichero “wp-comments-post.php” a ver si así me quito algo de spam.
    Saludos.

    Viernes, 26 de Octubre/2007 @ 18:39

  9. Gravatar de micki micki nos comenta:

    Muy buen artículo, gracias! Acabo de probar el truco de modificar wp-comments-post.php, no se me había ocurrido. A ver si me reduce el spam, porque últimamente estoy un poco saturadico :)

    Martes, 8 de Enero/2008 @ 13:42

  10. Gravatar de Armonth Armonth nos comenta:

    micki este artículo esta a modo de introducción aunque últimamente lo que funciona muy bien es el sistema del campo oculto. Frena el 100% del spam en comentarios (no trackbacks) automáticos…

    Martes, 8 de Enero/2008 @ 15:32

  11. Gravatar de Vseo Vseo nos comenta:

    Es increible lo del spam. si además tienes en cuenta las vulnerabilidades presentes ya te puedes volver loco. Yo estuve sufriendo los enlaces pegados en el footer.

    Miércoles, 9 de Enero/2008 @ 15:32

  12. Gravatar de Quique Quique nos comenta:

    Hola, y gracias por el artículo.

    Lo que no entiendo de esto es que me sucede que está entrando spam siempre desde un artículo específico de mi blog de WordPress instalado en mi servidor. Además tengo instalado un pluggin, el “Did You Pass Math?”, que funciona bien pero en estos casos no logra filtrarlo. ¿Cuál puede ser el problema? ¿Qué opinan?

    Gracias y saludos,

    Miércoles, 19 de Marzo/2008 @ 12:30

No seas tímido, da tu opinión

Sé respetuoso con los demás, la diferencia de opiniones enriquece la discusión, los comentarios bajo ciertas circunstancias pueden ser moderados y requerir aprobación.