Otra sobre spam en Wordpress
Lamentablemente, el cerebro de los spammers a veces tiene algo que más que agua. Para evitar los filtros por palabras, los muy simpáticos han tomado la talla de enviar entidades de caracter, reemplazando las vocales.
Me explico. Como todos ustedes han leído el curso de XML, no tengo para que explicar que las entidades son una referencia a otro texto. En el estándar HTML, se define que una entidad con el formato &#[numero]; debe ser reemplazado por la letra cuyo código sea [numero], dependiendo de la codificación. Por ejemplo, o es reemplazado por o ( revisen el código fuente, allí podrán darse cuenta.
Entonces, estos chicos malos ya no envían 'poker' en sus mensajes, sino poker
La función php que puede hacer decodificar este truco es:
$sArg=preg_replace_callback("/(d+;)/",
create_function('$a','$l=$a[1];
preg_match("/(d+);/",$l,$b);
return chr($b[1]);'),$sArg);
Siendo $sArg el texto a alterar. Por tanto, y si la memoria no falla, aquí tienen la función check_comment de wp-includes/functions.php actualizada para manejar esto.
function check_comment($author, $email, $url, $comment, $user_ip) {
if (1 == get_settings('comment_moderation')) return false; // If moderation is set to manual
if ('' == trim( get_settings('moderation_keys') ) ) return true; // If moderation keys are empty
$words = explode("n", get_settings('moderation_keys') );
foreach ($words as $word) {
$word = trim($word);
if(!strlen($word)) {continue;}
$pattern = "#$word#i";
$aArgs=func_get_args();
foreach($aArgs as $sArg) {
$sArg=preg_replace_callback("/(d+;)/",create_function('$a','$l=$a[1]; preg_match("/(d+);/",$l,$b); return chr($b[1]);'),$sArg);
if (preg_match($pattern,$sArg,$aMatch)) die("Filtro anti-spam. Palabras prohibidas:".implode(',',$aMatch));
}
}
if ( (count(explode('http:', $comment)) - 1) >= get_settings('comment_max_links') )
return false; // Check # of external links
return true;
}
Que tengan un buen día, sin spam!
- 1993 lecturas

Enviar un comentario nuevo