Защита от спама форума SMF 1.1.x, часть 2
Дата: 31 августа, 2010 год
В первой части (дада, она оказалось первой, после того как появилась вторая:)) я вроде бы поставил точку на теме защиты от спама форума SMF. Однако, как показала практика и время, не все так радужно, и мне снова пришлось взяться за эту проблему.
Описанный ранее мод reCAPTCHA for SMF выдает свою каптчу только при регистрации, а грязный хак, что описывается в конце первой части, спокойно пропускает сообщения, во1, без URL, во2, сообщения с неактивными URL (некликабельными).
Для чего спамерам постить сообщения без ссылок? есть 2 причины:
- Ссылку можно поставить в профиле после регистрации (но т.к. у нас на регистрации стоит reCAPTCHA, беспокоиться не о чем)
- Спамер проверяет, модерируется ли форум, а также индексируется ли он. То есть, спам-бот постит случайный набор символов, а потом через недельки две проверяет. Если этот случайный набор находится в поисковике, и на форуме он по-прежнему находится, значит, на этот форум можно постить ссылки.
В последнее время «проверяющих» сообщений стало ну просто дофигища, и я засел за проблему. Залез в моды для SMF, увидел, что ничего с прошлого моего захода не поменялось, и понял, что нужно делать свой хак. Решение пришло быстро — добавить в форму ответа простой checkbox, отмечая который реальные посетители будут идентифицировать свою реальность :)
Итак, нужно поменять и добавить кода в следующие файлы:
- в файл Display.template.php после
<input type="hidden" name="num_replies" value="', $context['num_replies'], '" />';
добавить код:
if ($context['user']['is_guest']) { echo '<table width="95%" cellspacing="5" cellpadding="0" border="0"><tr><td align="left"><input type="text" name="guestname" size="22" /> Имя</td></tr><tr><td align="left"><input type="text" name="email" size="22" /> E-mail</td></tr><tr><td align="left"><input type="checkbox" name="chicken"/> ', $txt['no_spam'], '</td></tr></table>'; }
Данный код добавить к быстрому ответу, во1, имя и email (которые почему-то отсутствуют), а во2 — тот самый checkbox.
- в файл 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><input type="checkbox" name="chicken"/></td></tr>'; }
Этот код добавит checkbox в форму расширенного ответа.
- в файл Post.php (папка sources) после
$post_errors[] = 'long_name';
добавить код:
if (!$_POST['chicken']) $post_errors[] = 'spamer';
Собственно, добавляем само действие — если checkbox не отмечен — возвращаем ошибку.
- в файл Errors.russian-utf8.php добавить в конец строку:
$txt['error_spamer'] = 'Вы забыли поставить галочку напротив "Я не спамер"';
в файл index.russian-utf8.php добавить в конец строку:
$txt['no_spam'] = 'Я не спамер';
А это сообщения и надписи, которые будут выводиться
Вот, собственно, и все.. template-файлы лежат либо в папке /Themes/ваша_тема/, либо в папке /Themes/Default/
Вот так это выглядит в быстром ответе:
А вот так происходит сообщение об ошибке при непоставленной галочке:
Замечу, что эта проблема возникла с форумом, где гости имеют право постить без регистрации!. В случае, когда это запрещено, все намного проще, спасает reCAPTCHA