sinprogramar.blogspot.com

11/2/09

Eliminar spam en los comentarios de wordpress II

En el anterior post os conté un truquillo para evitar el spam en los comentarios de wordpress generado de manera automática. El truquillo consistía en modificar el name (o el id en su defecto) de los campos del formulario para que los comentarios generados y enviados de forma automática diesen un error al no coincidir el nombre de los campos.

Pero al parecer esta solución solo funcionó unas horas, el tiempo que tardó nuestro "entrañable spammer" en modificar su plantilla de formulario.

Después de darle vueltas, aplique 3 nuevos frentes de ataque:
  1. Cambiar el nombre del archivo procesa los comentarios. Fue efectivo durante unas horas.
  2. Eliminar las trackbacks (origen de parte del spam). Prescindir de los trackbacks supone la perdida de una funcionalidad interesante de wordpress, pero en mi caso me da más problemas que beneficios.
  3. La solución definitiva: Generar un código en cada formulario que cambia una vez por minuto. Si no coincide con el código del servidor o si se supera un tiempo determinado el formulario da un error.
El resultado final se puede ver en el gráfico:

De un pico de 1.269 spam interceptados por Akismet he pasado a uno o dos al día.

Para crear el sistema que genera el código basta con modificar 2 archivos:
wp-comments-post.php
/wp-content/themes/nombre_tema/comments.php

  • Abrimos comments.php y añadimos lo siguiente dentro de:
    <?php $codigo = date("Hi")*10; ?>
    <input type="hidden" name="codigo_servidor" value="<?php echo $codigo; ?>" />


    La primera linea genera una variable llamada "codigo" con el valor de la hora y minuto del servidor multiplicada por 10. La segunda linea crea un campo oculto con el valor de la variable "codigo" y con el nombre de "
    codigo_servidor".

    El cliente recibirá en su navegador algo así como:
    <input type="hidden" name="codigo_servidor" value="12000" />
    12000 corresponde a las 12:00 multiplicado por 10. Podemos personalizar el código generado cambiando el 10 por otro numero u otras operaciones más complejas.

  • Ahora hay que crear la función en wp-comments-post.php.

    //control de validacion del codigo enviado en el formulario
    $codigo_recibido = trim($_POST['codigo_servidor']);

    $codigo_control = date("Hi")*10;


    if( $codigo_recibido > $codigo_control -150 && $codigo_recibido < $codigo_control +150 ){
    $comment_author = trim(strip_tags($_POST['author']));

    $comment_author_email = trim($_POST['email']);
    $comment_author_url = trim($_POST['URL']);
    $comment_content = trim($_POST['comment']);

    };


    La variable "codigo_recibido" recoge el valor del campo oculto que hemos creado para el formulario y "codigo_control" contiene un valor estraido de la hora, minuto y multiplicado por 10 (misma operación que la de comments.php).

    Después creamos una función que encierra las variables ya existentes (author, email, etc ) y que se encarga de comparar que el código que se envió en el formulario de comentarios sea igual que el del servidor.
    Como el código se genera con la hora y minuto le añadimos un margen de 15 minutos para escribir el comentario desde que se recibió la página. Podemos aumentar el tiempo aumentando el valor. En mi caso 150 equivale a 15 minutos porque multiplicamos por 10. Si por ejemplo hubiésemos multiplicado por 2 pondríamos 30 para los 15 minutos.

    El condicional no permite que se procesen las variables de su interior si el código del servidor y del formulario no son iguales y nos envía a la página de error del formulario. Esto es lo que les sucederá a los spammers que envíen comentarios automáticos ya que su plantilla no tendrá el código oculto, y en el caso de que lo añadiesen tampoco les serviría porque cambia continuamente.

    Si se quiere complicar más el tema se puede añadir la fecha y otras operaciones, pero dudo mucho de que un spammer se dedique a estudiar detenidamente como funciona el sistema, averigüe de donde se obtiene el código y programe una plantilla que cree los códigos de forma sincronizada con la hora de tu servidor... aunque quién sabe.
Este apaño es de cosecha propia y lo he realizado con mis limitados conocimientos de programación. Existen otras maneras mejores de realizar esto, pero yo no sabría hacerla.

Espero que os sirva de ayuda.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.


Creative Commons License