Publicado el Miércoles 10 de Enero del 2007 @ 21:35 por Armonth.
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.
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:
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.
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:
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:
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í.
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.
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.
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
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.
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. :-)
Excelente artículo. Claro y conciso.
Enhorabuena.
Muy útil, Gracias!
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.
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 :)
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.
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,
taweno
El web spammer mas indigno de España es Destinia. Creo que es una vergueza y algo de sobra conocido.
Hola! excelentes consejos :)
Una duda que tengo sobre el método de utilizar el .htaccess:
en el caso de que el blog esté alojado en alguna carpeta como por la típica “wordpress”, las sentencias serían las mismas o la primera pasaría a ser:
RewriteCond %{HTTP_REFERER} “!^http://sigt.net/wordpress/.*$” [NC]
???
Un saludo y gracias por las ideas!