El SPAM contraataca!
El método que implementé contra el SPAM, que comenté en esté articulo, ha estado funcionando bien, pero en los últimos 2 meses ha dejado de cazar todo el SPAM. Los últimos comentarios que están llegando sí que traen el campo de email cumplimentado, por lo que ya no es efectivo. Dándole vueltas al asunto, se me ha ocurrido hacer mi propia base de datos anti-spam. La idea es que cada vez que llega un nuevo comentario, se comprueba con la base de datos si es SPAM, y en caso que lo sea, añadir sus datos para futuras comprobaciones. El código es el siguiente:
En wp_includes/comment.php en el método wp_insert_comment, justo antes de insertar el comentario hago esta comprobación:
if(!is_email($comment_author_email)){
$comment_approved = 'spam';
}
else{
$spam_query = "SELECT * FROM spam_data "
."WHERE data = '".$comment_author_IP
."' OR data = '".$comment_author_email
."' OR data = '".$comment_author_url."'";
/*$spam_query = "SELECT * FROM spam_data "
."WHERE 1";*/
$spam_results = $wpdb->get_results($spam_query);
/*if(count($spam_results) <= 0){ // It's SPAM
$comment_approved = 'spam';
}*/
if(count($spam_results) > 0){ // It's SPAM
$comment_content .= " count: ".count($spam_results);
$comment_approved = 'spam';
insert_into_spam_data($comment_author_IP);
insert_into_spam_data($comment_author_email);
insert_into_spam_data($comment_author_url);
}
}
Y para añadir los datos a la BD he añadido este método:
function insert_into_spam_data($spam_data){
global $wpdb;
$spam_query = "SELECT * FROM spam_data "
."WHERE data = '".$spam_data."'";
$spam_results = $wpdb->get_results($spam_query);
if(count($spam_results) <= 0){
$wpdb->insert(
'spam_data',
array(
'data' => $spam_data
),
array(
'%s'
)
);
}
}
Esto debería parar una buena parte del SPAM. El siguiente paso será que cuando yo marque manualmente un comentario como SPAM, sus datos también sean incluidos en la tabla con la información de SPAM. Para ello en el metodo wp_spam_comment, tras marcar el comentario como SPAM, añadimos este código:
insert_into_spam_data($comment->comment_author_IP);
insert_into_spam_data($comment->comment_author_email);
insert_into_spam_data($comment->comment_author_url);
Ahora faltará ver como de efectivas son las medidas. Me estoy planteando introducir algún otro tipo de comprobación anti-spam, viendo que el captcha no está funcionando. Pero eso para otro artículo más adelante 🙂