Существует несколько категорий методов защиты от спама. Удачное комбинирование - ключ к успеху в борьбе против спамеров за ваши площадки.
Превентивные методы направлены на предотвращение отправки сообщений сомнительного характера. На практике эти методы достаточно грубы, и сильно бьют по «хорошим» посетителям.
Распространенная практика - запрет на добавление комментариев для анонимных пользователей. Регистрация на крупных форумах нередко намеренно усложняется для защиты от спама. Ввод слов с картинки, подтверждение по электронной почте, одобрение администратором сайта - далеко не полный список того, через что приходится проходить обычным людям, которые хотят задать один(!) вопрос.
Методы фильтрации направлены на изучение пользовательских сообщений и выявление признаков некачественного содержимого. Скажем, если в одном комментарии к блогу стоит десять ссылок, это спам с высокой вероятностью.
Автоматические алгоритмы проверки нередко ошибаются и ценные материалы не публикуются. Ручная модерация отнимает много времени и может сильно замедлять процессы информационного обмена.
При построении системы защиты от спама важно соблюсти баланс. Пользователи должны иметь возможность писать без проблем. А администраторы и модераторы должны быть избавлены от разгребания гор спама.
Ручная модерация и полностью автоматическая система проверки - две крайности. Ручная модерация - это затратно и неоперативно. Полностью автоматическая система - гарантированная потеря какого-то числа качественных сообщений. Пользователи очень обижаются.
В комплексе с вышеперечисленными методами хорошо работают редкие и оригинальные подходы. Поскольку разработчики ботов заинтересованы в широком охвате форумов и блогов, уникальное решение может стать отличной защитой.
Спамеры не заинтересованы в конкретном блоге, поэтому концентрируются на слабо защищенных, построенных на популярных платформах. Та же ситуация с форумами. Есть примеры самодельных форумов, существующих без регистрации пользователей годы, и видевших спам только несколько раз.
Регистрация пользователей как метод защиты от спама
Только популярные ресурсы могут позволить себе устраивать сложные процедуры регистрации пользователей. Если подобными вещами начнет заниматься владелец малоизвестного блога - распугает всех посетителей.
Стратегия основана на том, что по умолчанию сайт не доверяет пользовательскому содержимому. Эдакая презумпция виновности. По каким-то признакам формируется список доверенных пользователей, и им уже разрешается писать сообщения.
У этого подхода есть серьезные проблемы: слишком жесткая процедура регистрации действительно может отпугнуть посетителей, а мягкая - позволит просачиваться в списки «хороших» пользователей спамерам и даже ботам.
Такая история случилась с очень популярным форумным движком PHPBB: боты научились регистрироваться, разгадывать значение каптчи и подтверждать участие по электронной почте.
Каптча (CAPTCHA)
CAPTCHA - компьютерный тест, используемый для того, чтобы определить, человек ли использует систему.
В русской «Википедии» можно узнать больше о каптче. Каптча - это та картинка с размытыми символами, которые так часто нужно ввести при отправке комментария в блоге или при регистрации на форуме.
Огромная проблема - настоящие посетители тратят время, честно разгадывая хитрую вязь. Боты же просто уходят на другой сайт, где каптчи нет. Кстати, некоторые боты умеют считывать текст с картинок (FineReader же умеет).
Итак, каптча может быть графической, смысловой или даже звуковой. Смысл - поставить робота в тупик.
Еще один недостаток - каптча не спасает от ручного спама.
Самый частый вид каптчи - картинка с текстом. По идее человеку должно быть просто воспроизвести то, что он видит. На самом деле, нет. Видели каптчу «Яндекса»?
Меньше распространена смысловая каптча. Посетителя просят выполнить несложное арифметическое действие или ответить на какой-нибудь простой вопрос. Сколько будет 5 + 9? Кто написал «Идиота»? Всегда есть шанс, что человек не ответит.
Еще один вариант - попросить посетителя оставить поле пустым. Боты обычно стремятся заполнить все доступные поля, так себя и выдадут. От человека пустое по умолчанию поле можно спрятать с помощью CSS и ему даже не придется задумываться о каптче.
Нашлась отличная статья о том, как защитить сайт от спама без каптчи, не заставляя пользователей регистрироваться.
Владислав Мысла написал длинную статью про разные капчти, ошибки разработчиков и способы обхода подобной защиты. Достаточно познавательно. Статья ориентирована на разработчиков, но и всем любопытным будет полезна.
P. S. - некоторые называют каптчу капчей (без «т»). Наверное это не очень правильно, ведь в оригинале CAPTCHA.
Анализ поведения посетителей
Защищаться от спама можно, анализируя поведение посетителей. Многие боты ведут себя не так, как люди.
Человеку нужно некоторое время на ознакомление с содержимым страницы. Программа «читает» всю страницу очень быстро, а поскольку у нее огромный список адресатов, она не может себе позволить подолгу ждать. Впрочем, этот метод достаточно сложен в реализации.
Иногда защита строится на сравнении HTTP-запросов, посылаемых пользователями, с известными спамерскими образцами. Успешность этого способа сильно зависит от качества базы эталонных профилей. Примером такой защиты является модуль Bad Behavior для CMS Drupal.
«Черные» и «белые» списки
«Черные» и «белые» списки пользователей могут быть реализованы в качестве вспомогательной меры в антиспамовом комплексе сайта.
В списках можно хранить имена пользователей, адреса сайтов, IP-адреса, адреса электронной почты.
Если пользователь замечен в злоупотреблении, то его данные включаются в «черный» список, вследствие чего его права на сайте ограничиваются.
Дело не такое простое. Списки нужно пополнять, следить за их качеством. Пользователь легко может назваться по другому. IP-адрес - неоднозначный идентификатор.
Блокировать сообщения со ссылками на сайты из «черного» списка - более или менее разумная практика.
Если вы уверены в ком-то, можно убрать с него проверки и разрешить писать что угодно. Этого можно достичь включением данных пользователя в «белый» список.
«Белые» списки хорошо помогают, когда автоматическая защита с завидным упорством борется с хорошими читателями.
Этот подход может реализовываться как в комплексе с регистрацией пользователей, так и без нее.
Фильтрация сообщений
Все, поступившие от пользователей сообщения, можно проверять на предмет похожести на спам. Это называется фильтрацией.
Можно фильтровать текст сообщений. Например, если ваш блог не поддерживает bb-код, комментарии можно проверять на наличие этих тегов. По похожему принципу работают антиматные фильтры на форумах.
Другой вариант, проверять количество ссылок в одном сообщении. Поскольку боты обычно рассылают массовые универсальные сообщения, в них можно встретить и HTML-теги, и bb-код, и десяток ссылок.
«Пожаловаться на спам»
К борьбе со спамом можно привлекать пользователей. В разумных рамках, кончено. Почтовые службы, блог-хостинги и поисковые системы уже дано обзавелись кнопками «пожаловаться на спам». Подобную практику можно использовать на форуме или в блоге.
Пользователи должны быть лояльными и заинтересованными в успешном функционировании сайта.
Соль в том, что даже самым хорошим пользователям нельзя доверять окончательное решение участи поста, поскольку они всё же могут злоупотреблять возможностью скорой расправы.
Поэтому сообщения о спаме лучше пусть носят рекомендательный характер. При этом они должны рассматриваться оперативно. Результаты должны быть видны.
Применительно к нашему случаю: /Проекты/Симоненко/www.movs-mirea.ru (ужесточение регистрации)
./Sources/Register.php
Find: [Select]
elseif (isset($_SESSION[´visual_errors´]))
unset($_SESSION[´visual_errors´]);
Replace With: [Select]
elseif (isset($_SESSION[´visual_errors´]))
unset($_SESSION[´visual_errors´]);
//Check Forum Spam if enabled
if (!empty($modSettings[´sfs_enabled´])) {
if (SpammerCheck()) {
loadLanguage(´SFS´);
fatal_error(sprintf($txt[´sfs_spam_detected´],$_POST[´user´],$_POST[´email´],$user_info[´ip´]), true);
}
}
Find (at the end of the file): [Select]
?>
Add Before: [Select]
function SpammerCheck()
{
global $txt, $boarddir, $context, $settings, $modSettings, $user_info, $sourcedir;
$isSpammer=0;
$emailSpam=$_POST[´email´];
$ipSpam=$user_info[´ip´];
$usernameSpam=$_POST[´user´];
$response=´´;
$url=´http://www.stopforumspam.com/api?email=´ . $emailSpam;
require_once($sourcedir . ´/Subs-Package.php´);
$response = fetch_web_data($url);
//Is Email Spammer??
if (strpos($response, "<appears>yes</appears>") > 0) $isSpammer=1;
if (!$isSpammer && !empty($modSettings[´sfs_ipcheck´])) { //If Not Spammer check the IP
//Check IP Spammer
$url=´http://www.stopforumspam.com/api?ip=´ . $ipSpam;
$response = fetch_web_data($url);
//Is IP Spammer??
if (strpos($response, "<appears>yes</appears>") > 0) $isSpammer=1;
}
if (!$isSpammer && !empty($modSettings[´sfs_usernamecheck´])) { //If Not Spammer check the username
//Check Username Spammer
$url=´http://www.stopforumspam.com/api?username=´ . $usernameSpam;
$response = fetch_web_data($url);
//Is IP Spammer??
if (strpos($response, "<appears>yes</appears>") > 0) $isSpammer=1;
}
return $isSpammer;
}
./Sources/ManageRegistration.php
Find: [Select]
loadLanguage(´Login´);
Add After: [Select]
loadLanguage(´SFS´);
Find: [Select]
´coppaFax´ => !empty($_POST[´coppaFax´]) ? $_POST[´coppaFax´] : ´´,
´coppaPhone´ => !empty($_POST[´coppaPhone´]) ? $_POST[´coppaPhone´] : ´´,
Add After: [Select]
´sfs_enabled´ => !empty($_POST[´sfs_enabled´]) ? $_POST[´sfs_enabled´] : ´´,
´sfs_ipcheck´ => !empty($_POST[´sfs_ipcheck´]) ? $_POST[´sfs_ipcheck´] : ´´,
´sfs_usernamecheck´ => !empty($_POST[´sfs_usernamecheck´]) ? $_POST[´sfs_usernamecheck´] : ´´,
./Themes/default/Register.template.php
Find: [Select]
function template_admin_settings()
{
global $context, $settings, $options, $scripturl, $txt, $modSettings;
Add After: [Select]
echo ´<script language="JavaScript" type="text/javascript"><!--
function sfsEnableSFS( enabled ) {
if (enabled)
document.getElementById(´sfs_enabled´).checked = true;
}
function sfsEnableCheckIP( enabled ) {
if (!enabled)
document.getElementById(´sfs_ipcheck´).checked = false;
}
//--></script>´;
Find: [Select]
</tr><tr class="windowbg2">
<td width="100%" colspan="2" align="center">
<hr />
</td>
</tr><tr class="windowbg2" valign="top">
Replace With: [Select]
</tr><tr class="windowbg2">
<td width="100%" colspan="2" align="center">
<hr />
</td>
</tr><tr class="windowbg2" valign="top">
<th width="50%" align="right">
<label for="send_welcomeEmail_check">´ . $txt[´sfs_txt_sfsenabled´] . ´</label> :
<br /><span class="smalltext" style="font-weight: normal;">´ . $txt[´sfs_txt_sfsenabled_desc´] . ´</span>
</th>
<td width="50%" align="left">
<input type="checkbox" name="sfs_enabled" id="sfs_enabled"´, !empty($modSettings[´sfs_enabled´]) ? ´ checked="checked"´ : ´´, ´ class="check" onclick="sfsEnableCheckIP(this.checked);" />
</td>
</tr><tr class="windowbg2" valign="top">
<th width="50%" align="right">
<label for="send_welcomeEmail_check">´ . $txt[´sfs_txt_ipcheck´] . ´</label> :
<br /><span class="smalltext" style="font-weight: normal;">´ . $txt[´sfs_txt_ipcheck_desc´] . ´</span>
</th>
<td width="50%" align="left">
<input type="checkbox" name="sfs_ipcheck" id="sfs_ipcheck"´, !empty($modSettings[´sfs_ipcheck´]) ? ´ checked="checked"´ : ´´, ´ class="check" onclick="sfsEnableSFS(this.checked);" />
</td>
</tr><tr class="windowbg2" valign="top">
<th width="50%" align="right">
<label for="send_welcomeEmail_check">´ . $txt[´sfs_txt_usernamecheck´] . ´</label> :
<br /><span class="smalltext" style="font-weight: normal;">´ . $txt[´sfs_txt_usernamecheck_desc´] . ´</span>
</th>
<td width="50%" align="left">
<input type="checkbox" name="sfs_usernamecheck" id="sfs_ipcheck"´, !empty($modSettings[´sfs_usernamecheck´]) ? ´ checked="checked"´ : ´´, ´ class="check" onclick="sfsEnableSFS(this.checked);" />
</td>
</tr><tr class="windowbg2">
<td width="100%" colspan="2" align="center">
<hr />
</td>
</tr><tr class="windowbg2" valign="top">
_____________________________________________________________________________
File Operations
Move the included file "SFS.english.php" to "./Themes/default/languages".
Move the included file "SFS.english-utf8.php" to "./Themes/default/languages".
Move the included file "SFS.italian.php" to "./Themes/default/languages".
Move the included file "SFS.italian-utf8.php" to "./Themes/default/languages".
Move the included file "SFS.arabic.php" to "./Themes/default/languages".
Move the included file "SFS.arabic-utf8.php" to "./Themes/default/languages".