Может кому-то пригодится
На моих сайтах разрешены комментарии без регистрации. Капчу не пользую - ибо ненавижу.
Комплекс мероприятий по борьбе со спамом выглядит так:
1. Из толковых стандартных антиспам модулей - самый действенный - honeypot, процентов 70 отсекает.
2. Дополнительно: самодельный модуль в котором:
- проверяется отсутствие русских букв. если нет - в очередь на модерацию. (не всем подходит, но на моих сайтах иностранцы почти не появляются)
- проверка IP по базе http://www.stopforumspam.com. Чтобы каждый раз не обращаться к базе онлайн, по крону ежедневно скачиваю обновление здесь http://www.stopforumspam.com/downloads/listed_ip_365.zip
для 6 друпал примерно так:
function mymodule_comment($comment, $op) {
$spam=false;
$comment = (object)$comment;
if ($op == 'insert') {
// проверка на наличие русских букв
if(!preg_match( '/[а-яё]/ui',$comment->subject))
{
$spam=true;
//drupal_set_message ('нет русских букв');
}
//проверка на присутствие ip в спам базе, listed_ip_365.txt - предварительно скачанный список спамерских ip, ссылка есть выше
$file = file_get_contents("listed_ip_365.txt");
if(strstr($file,ip_address())){
$spam=true;
// докучи занести ip негодяя в BL сайта, хотя и не обязательно
db_query("INSERT INTO {access} (mask, type, status) VALUES ('%s', '%s', %d)", ip_address(), 'host', 0);
}
else{ // если нет в файле, то на всякий случай онлайн проверка
$xml_string = file_get_contents('http://www.stopforumspam.com/api?ip='.ip_address().'&email='.$comment->mail);
if (strstr ($xml_string,'yes')) {
$spam=true;
db_query("INSERT INTO {access} (mask, type, status) VALUES ('%s', '%s', %d)", ip_address(), 'host', 0);
}
}
if ($spam)
{
$operation = comment_operations('unpublish');
$query = $operation['unpublish'][1];
db_query($query, $comment->cid);
drupal_set_message(t('Your comment has been queued for moderation by site administrators and will be published after approval.'));
watchdog('StopSPAM', ip_address().' - Comment unpublished for DNSBL: %subject.', array('%subject' => $comment->subject), WATCHDOG_INFO, l(t('view'), 'node/'. $comment->nid, array('fragment' => 'comment-'. $comment->cid)));
} else {
drupal_set_message(t('Your comment was published. '));
}
}
return;
}
Для 7 друпал все то же самое с минимальными переделками
8 января 2013, Елена Сунгатова