El retorno del SPAM
La solución con la base de datos de SPAM debo reconocer que fue ingeniosa. Está muy en mi línea de “matar moscas a cañonazos”. El problema es que lo que se dice eficaz, no era. Digamos que el número de direcciones IP desde las que puede llegar SPAM, o el número de direcciones de correo o URLs que pueden usar en los comentarios están en un orden de magnitud tal que nunca voy a ser capaz de filtrar los comentarios basura.
Todo vuelve a la pregunta que me hice hace ya hace 9 meses: ¿Como estaban los bots de SPAM enviando comentarios saltándose el formulario de envío? Y por pura casualidad, encontré a que página están atacando. Probablemente están haciendo un POST directamente contra wp-comments-post.php.
Así que volvemos a la sencillez. ¿Como detectar un POST que llega a wp-comments-post.php sin pasar por comments.php? Fácil. Si los bots están lanzando un POST genérico para blogs en WordPress, añadamos un nuevo campo al formulario. Si en wp-comments-post.php detectamos que ese campo no está establecido, entonces se está saltando comments.php y debe ser SPAM. Está solución es tan eficaz que hace que mis dos soluciones anteriores queden obsoletas, así que para aligerar la página y reducir tiempo de procesado, elimino las modificaciones del código anteriores. El código definitivo quedaría de la siguiente manera:
Dentro de los ficheros del tema, en el fichero comments.php:
Añadimos un nuevo campo oculto al formulario:
<input type="hidden" id="comment_post_antirobot" name="comment_post_antirobot" value="0" />
Por si acaso el robot de SPAM está comprobando que campos tiene el formulario, cambiamos su valor por javascript:
<script type="text/javascript">
document.getElementById('comment_post_antirobot').value = "1";
</script>
En wp-comments-post.php:
Obtenemos el valor del campo oculto, y en caso de no estar establecido o no ser igual a 1, marcamos el comentario como SPAM modificando el contenido:
$comment_antirobot = ( isset($_POST['comment_post_antirobot']) ) ? trim($_POST['comment_post_antirobot']) : null;
if( empty($comment_antirobot) || $comment_antirobot == '0'){
// It's SPAM
$comment_content = '[THIS#IS#SPAAAM!] '.$comment_content;
}
En wp-includes/comment.php, en el método wp_insert_comment:
Comprobamos si contiene la marca de SPAM en su contenido, y en ese caso lo etiquetamos como SPAM:
if(strpos($comment_content, '[THIS#IS#SPAAAM!]') !== false){
$comment_approved = 'spam';
}
De momento, el SPAM que está llegando se está etiquetando todo automáticamente como tal. A ver cuanto dura la solución… aunque en esta tengo bastante confianza!