Centaur
00:51 13-02-2006 [Web][Soft] Ломаем кайф форумным спамерам
Прикрутил к нашему аниме-форуму автоматическую распознавалку спамных топиков. Теперь бо́льшая часть спама сразу уходит мусорку. Мелочь, а приятно.

Есть у нас форум на phpBB. С завидной регулярностью на него приходит с какого-нибудь итальянского или турецкого IP’шника робот и вываливает пачку ссылок на раскручиваемый сайт, в надежде, что Гугл увидит эти ссылки и повысит сайту рейтинг. (Гугл на эти потуги плевал с высокой ёлки, но нам-то от этого не легче…) Мы эти сообщения почти сразу уносим в отдельный раздел, баним юзера, а при рецидивах — всю сеть нарушителя (вон сегодня утром забанил Telecom Italia Net — два миллиона адресов…). Однако, надоедает. Запрещаем анонимам писать. Не помогает — робот регистрирует новых юзеров. Включаем CAPTCHA — эту дурацкую задачку на распознавание циферок-буковок. Не помогает, роботы научились читать. Следующий шаг обычно — включение активации по e-mail’у. Но это как-то не очень дружественно по отношению к живым людям.

Дык вот. У текста, сгенерированного программой, есть одно большое преимущество: его обычно можно разобрать программой. Берём среднестатистическое спамное сообщение. Как правило, в нём доххххрена ссылок на отдельных строчках, и ничего больше. Это запросто формализуется. Например, так:
// forum/includes/functions_post.php, в функции submit_post
if (preg_match("#^(\\[url=.*?\\].*?\\[/url\\][\\n\\r]*){10,}$#", $post_message))

Дальше с сообщением можно делать что хочешь. Хочешь — тихо брось его на пол, выдав стандартное Thank you for posting, чтобы пчёлы ничего не заметили. Хочешь — не менее тихо подмени в запросе к базе данных идентификатор раздела форума, чтобы оно свалилось в мусорку, и можно было его оттуда при случае достать. Хочешь — прикрути сложную логику, типа «посмотреть, не было ли раньше спама с этого IP-адреса, если был, то забанить его к чертям; если не было, но был спам из той же сети, то забанить всю сетку; вытащить из сообщения адрес раскручиваемого сайта, найти, где он хостится, и выслать модератору форума шаблон жалобы хостеру».

Впрочем, так далеко мы пока не пойдём. Вполне достаточно, чтобы мусор сам уходил в ведро:
{
  $sql_getforumname = "SELECT forum_name FROM " . FORUMS_TABLE .
    " WHERE forum_id = " . $forum_id;

  if ($result_getforumname = $db->sql_query($sql_getforumname))
  {
    if ($row_getforumname = $db->sql_fetchrow($result_getforumname))
    {
      $post_message .= "\n\n[i:" . $bbcode_uid . "]Automatically moved from " .
        "[url=http://" . $board_config['server_name'] . 
        $board_config['script_path'] . "viewforum.php?f=" . $forum_id . 
        "]" . $row_getforumname['forum_name'] . "[/url][/i:" . $bbcode_uid . "]";
    }
  }
  $forum_id = 9; // это ID’шник раздела «Мусорка»
}


Upd. Ах да. Кажется, они называют это «поисковой оптимизацией».
Комментарии:
Xirax
04:08 13-02-2006
Роботы научились распознавать картинки? Ого. Это как? Там же текст наизнанку вывернут обычно...
Centaur
13:49 13-02-2006
Ну, у phpBB штатное CAPTCHA такое довольно простое… символы одного фиксированного шрифта слегка сдвинуты вверх/вниз и присыпаны песком. Даже поворота на разные углы нет. Лёгкая медианная фильтрация, сравнение с образцом, и дело в шляпе.