Проблема спама в гостевых книгах в интернете существует очень давно. Когда-то радикальным средством борьбы со спамом на короткое время стали всевозможные защитные картинки - капчи. Но и они перестали давать должный результат - боты быстро научились перенаправлять картинки на порносайты, где их разгадывали страждущие до клубники, затем был период ипользования дешевой человечьей силы индусов по нольцелыххрендесятых цента за картинку, а потом программы распознавания, особенно специально заточенные, научились распознавать сильно зашумленные капчи не хуже человека. Блочить спам по IP теперь практически невозможно - спамеры закупают за копейки милионные пулы рандомных IP адресов, так что каждое новое сообщение будет приходить с разных айпишников.
В настоящее время бороться со спамом можно только комплексными мерами. Необходимо создать несколько слоев защиты: надо прикрутить капчу; написать несколько фильтров грубой аналитики, которые будут отсеивать сообщения с явными признаками спама; надо сделать хотя бы примитивный учет поведенческих факторов с привязкой к IP адресам, чтобы отсеивать мамкиных спамеров; надо сделать проверки по международным антиспамовым базам, например сделать защиту от спама с помощью stopforumspam.com.
По моим наблюдениям, последний пункт - самое мощное средство борьбы, но и оно работает неэффективно, если на сайт натравливается новая рекламная кампания, которая еще не успела набрать отрицательную статистику на ресурсах типа stopforumspam.com. И тут необходимо городить еще один слой защиты гостевой книги, который я называю "ретроспективное удаление спама".
Идея очень проста: проверять добавляемые сообщения нужно не только в момент добавления, но и периодически уже после того, как они появились в гостевой. Да, возможно спам-сообщения будут некоторое время висеть в гостевой, пока stopforumspam.com не накопит статистику, но как только это будет сделано (а делается это за пару часов), спам-сообщения будут автоматически удалены.
Такой механизм контроля спама хорошо подходит к редко модерируемым сайтам. Например, на этом сайте я имею возможность раз в пару недель проверять гостевую, и за это время в гостевой скапливается некоторое количество спам-сообщений, пробившихся через фильтры. Ретроспективное удаление в этом случае - единственный выход. И вот недавно я прикрутил примерно такой PHP код:
// Ретроспективное удаление спама - проверяются уже имеющиеся записи гостевой
private function retrospectSpamCheck()
{
$days=3; // Чтобы снизить нагрузку на базу,
// проверяются только записи, добавленные
// в указанное последнее количество дней
$edgeTime=time()-$days*3600*24;
$this->db->select('id, name, email, ip');
$this->db->where('time >', $edgeTime);
$query=$this->db->get('guest_book');
$messages=$query->result_array();
foreach($messages as $message) {
if($this->isSpam($message['name'],
$message['email'],
$message['ip'])) {
$this->db->where('id', $message['id']);
$this->db->delete('guest_book');
}
}
}
// Определение наличия спама через stopforumspam.com
function isSpam($name, $email, $ip)
{
try
{
$data = unserialize( file_get_contents(
'http://www.stopforumspam.com/api?&email='.
urlencode($email).
'&username='.urlencode($name).
'&ip='.urlencode($ip).
'&f=serial'));
// Если сервис StopForumSpam не отвечает
if($data===false)
return false;
if( isset($data['email']['appears']) and
isset($data['email']['confidence']) )
if($data['email']['appears']!=0 and
$data['email']['confidence']>=70)
return true; // Email в базе спаммеров
if( isset($data['ip']['appears']) and
isset($data['ip']['confidence']) )
if($data['ip']['appears']!=0 and
$data['ip']['confidence']>=70)
return true; // IP в базе спаммеров
return false;
}
catch (Exception $e)
{
return false;
}
}
Конечно, здесь есть место для оптимизации, например, вместо нескольких вызовов delete в цикле, можно сначала собрать ID записей гостевой книги, а потом удалить их одним SQL-запросом. И спам через stopforumspam.com можно детектить по другим признакам, а так же учесть, что вместо нескольких запросов API stopforumspam.com поддерживает кумулятивные запросы.
Теперь спама в гостевой как не бывало. Считаю, что это очень простой и эффективный метод борьбы. Пользуйтесь на здоровье.