Борьба со спамом, если капча не помогает…

Апрель 9th, 2011 Рубрики: PHP coubertin.cz www.colvillewoodworking.com

Борьба со спамом
Предыстория… Есть у меня один сайтик, и там есть гостевая книга, туда постоянно лезет спам. Спамеров (ботов или людей) капча не останавливала. Хотя я и ставил их штук 5 разных, да еще и подключался к сервису автоматической генерации капчи. Исходом стало введение премодерации которая клиента не обрадовала. Какая разница чистить на форуме или в админ панели, сказал он мне. Некоторое время мне понадобилось что бы придумать что то еще чем можно уберечь сайт от нашествия спам ботов. Мною были прочитаны десятки статей по этому поводу и в итоге я нашел вот эту статью под названием Построение эффективной Анти-Спам системы. Ссылка на исходники была мертвая и по моей просьбе автор выслал мне их. Меня постигло небольшое огорчение. исходники были на C… Недолго думая я решил переписать на php, о чем и будет рассказано в этой статье.
Для тех кто ленится почитать исходную статью я немного расскажу о теории.

Теория

После отправки сообщения система проверяет его и выставляет баллы, если в конце получилось 1 или больше то сообщение публикуется, если получилось 0 то сообщение помечается как спам и публикуется. Если меньше нуля то сообщение заведомо является спамом.

В своем скрипте я не стал реализовывать все правила, а лишь некоторые из них.

Правила

Правило Значения баллы
Количество ссылок в сообщении ≥2 -1 за каждую
<2 +1
Длина сообщения >20 символов и без ссылок +2
<20 -1
Ключевые слова Виагра, молоденькие и т.д. по словарю -1 за каждую
BB теги [url] и [link] -1 за каждый

На этом вроде с теорией все, можно реализовать некоторые другие правила, но для примера хватит и этих.

Исходный код

Что бы было проще проверять я сделал немного не так как было у автора статьи на хабре. А именно или спам или нет. За проверку отвечает функция которая отвечает false или true в зависимости от результата проверки.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function spam_filter($message) {
  $points = '0'; # начальное значение балов

  # присваиваем баллы за количество ссылок
  preg_match_all('/(http).?(:\/)/', $message, $out);
  $count_link ='0';
  foreach($out['0'] as $val) {
    $count_link++;
  }
  if ($count_link >= '2') {
    $points = $points - $count_link;
  } else {
    $points = $points + '1';
  }

  # присваиваем баллы за количество символов
  if (strlen($message) >= '20' and $count_link == '0') {
    $points = $points + '2';
  } else {
    $points = $points - '1';
  }

  # Проверка по фильтру
  $count_filter = '0';
  $query = mysql_query("SELECT `word` FROM `bad_word`;");
  while ($bad_word = mysql_fetch_row($query, MYSQL_NUM)) {
    preg_match_all('/'.$bad_word['0'].'/', $message, $out);
    foreach($out['0'] as $val) {
      $count_filter++;
    }
  }
  if ($count_filter > '0') {
    $points = $points - $count_filter;
  }

  # Поиск BB тегов
  $bb_count = '0';
  preg_match_all('/\[link/', $message, $out);
  foreach($out['0'] as $val) {
    $bb_count++;
  }
  preg_match_all('/\[url/', $message, $out);
  foreach($out['0'] as $val) {
    $bb_count++;
  }
  if ($bb_count > '0') {
    $points = $points - $bb_count;
  }

  # Вердикт
  if ($points >= '0') {
    return true;
  } else {
    return false;
  }
}

База данных

1
2
3
4
5
CREATE TABLE IF NOT EXISTS `bad_word` (
  `id_word` INT(4) NOT NULL AUTO_INCREMENT,
  `word` VARCHAR(255) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id_word`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

В базе у нас хранится словарь плохих слов, его вы должны заполнить сами 😉

Теги: , , ,

4 комментария к “Борьба со спамом, если капча не помогает…”

  1. Лев
    Апрель 10th, 2011 at 14:20
    1

    Отличная статья! Не так давно сам столкнулся с этим. Бороться не пришлось так как необходимость в сайте отпала (радоваться или нет…). При случае обязательно испробую это творение… хотя бы из интереса 😉

    [Ответить]

    ZekMan Reply:

    Мне дали еще пару советов, и возможно попозже я выложу обновленную версию. Но уже в таком виде спам отлично ловится!

    [Ответить]

  2. Август 15th, 2011 at 22:21
    2

    Thanks for this code.

    But I think there are some plugins are available for wordpress or other platforums.

    am I missing someting?

    [Ответить]

    ZekMan Reply:

    It is not for wordpress. It is for their projects, without cms.

    [Ответить]

Написать комментарий