Защита от спама форума SMF 1.1.x, часть 2

В первой части (дада, она оказалось первой, после того как появилась вторая:)) я вроде бы поставил точку на теме защиты от спама форума SMF. Однако, как показала практика и время, не все так радужно, и мне снова пришлось взяться за эту проблему.

Описанный ранее мод reCAPTCHA for SMF выдает свою каптчу только при регистрации, а грязный хак, что описывается в конце первой части, спокойно пропускает сообщения, во1, без URL, во2, сообщения с неактивными URL (некликабельными).

Для чего спамерам постить сообщения без ссылок? есть 2 причины:

  1. Ссылку можно поставить в профиле после регистрации (но т.к. у нас на регистрации стоит reCAPTCHA, беспокоиться не о чем)

  2. Спамер проверяет, модерируется ли форум, а также индексируется ли он. То есть, спам-бот постит случайный набор символов, а потом через недельки две проверяет. Если этот случайный набор находится в поисковике, и на форуме он по-прежнему находится, значит, на этот форум можно постить ссылки.

В последнее время “проверяющих” сообщений стало ну просто дофигища, и я засел за проблему. Залез в моды для SMF, увидел, что ничего с прошлого моего захода не поменялось, и понял, что нужно делать свой хак. Решение пришло быстро - добавить в форму ответа простой checkbox, отмечая который реальные посетители будут идентифицировать свою реальность :)

Итак, нужно поменять и добавить кода в следующие файлы:

  1. в файл Display.template.php после
';

добавить код:

if ($context['user']['is_guest']) {
 echo '<table width="95%" cellspacing="5" cellpadding="0" border="0"><tr><td align="left"> Имя</td></tr><tr><td align="left"> E-mail</td></tr><tr><td align="left"> ', $txt['no_spam'], '</td></tr></table>';
}

Данный код добавить к быстрому ответу, во1, имя и email (которые почему-то отсутствуют), а во2 - тот самый checkbox.

  1. в файл Post.template.php перед
// Are you posting a calendar event?

добавить код:

if ($context['user']['is_guest']) {
 echo '<tr><td align="right" style="font-weight: bold;', isset($context['post_error']['spamer']) || isset($context['post_error']['spamer']) ? 'color: red;' : '', '">', $txt['no_spam'], '</td><td></td></tr>';
}

Этот код добавит checkbox в форму расширенного ответа.

  1. в файл Post.php (папка sources) после
$post_errors[] = 'long_name';

добавить код:

if (!$_POST['chicken']) $post_errors[] = 'spamer';

Собственно, добавляем само действие - если checkbox не отмечен - возвращаем ошибку.

  1. в файл Errors.russian-utf8.php добавить в конец строку:
$txt['error_spamer'] = 'Вы забыли поставить галочку напротив "Я не спамер"';

в файл index.russian-utf8.php добавить в конец строку:

$txt['no_spam'] = 'Я не спамер';

А это сообщения и надписи, которые будут выводиться

Вот, собственно, и все.. template-файлы лежат либо в папке /Themes/ваша_тема/, либо в папке /Themes/Default/

Вот так это выглядит в быстром ответе: Вот так это выглядит в быстром ответе

А вот так происходит сообщение об ошибке при непоставленной галочке: А вот так происходит сообщение об ошибке при непоставленной галочке

Замечу, что эта проблема возникла с форумом, где гости имеют право постить без регистрации!. В случае, когда это запрещено, все намного проще, спасает reCAPTCHA

Архив обсуждения

Исторические комментарии сохранены из старого блога. Это архив, новые комментарии не добавляются. Всего: 2.

  1. Koronigrn

    Подскажите сайты, которые формируют базы данных предприятий на заказ по определенным спецификациям: нужны конкретные регионы и отрасли бизнеса.

    В Яндекс очень много сервисов, но не понятно что я буду иметь в результате.

  2. Андрей

    Сейчас уже checkbox походу все боты научились обходить. На своих проектах и чекбокс и капча стоит одновременно. Однако, все равно проскакивают регистрации. Но уже не по сотне за сутки.