SPAM + WordPress: medidas activas contra el SPAM

Autor: Armonth | El miércoles 10 de enero del 2007 @ 21:35.

Existen cuatro palabras mágicas que, si se conocen, 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 sobretodo de las medidas que se pueden introducir fácilmente en las dos últimas "palabras mágicas".

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 (y eso cuando es posible).

Por ello el vector habitual es el 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. Esto no arregla al 100% el consumo de CPU y de red pero ayuda.

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 perdida a la larga.

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.
  4. Todas las anteriores.

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="/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í.

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 aborta la petición.

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.

Comentarios