SATtva Персональная страница
темы архив все rss xml 2.0
 
 
блог
досье
связь
english
 

No pasaran! Спам в форумах и блогах

09.04.2006
security

Безрадостная картина

Спам, изначально определявшийся как "незапрошенная рассылка рекламного характера, произведённая неопределённому кругу получателей по электронной почте", давно вышел за пределы такого понятия. Все мы в периоды предвыборных кампаний получаем свою порцию спамерского политического пиара, причём не только по электронной почте, но и в ICQ, и даже в интернет-форумах. Спам теряет границы прежних формальных определений, по сути превращаясь в любую незапрошенную информацию с отсутствующим либо фальсифицированный источником распространения.

Современное ПО худо-бедно справляется со спамом в электронной почте, используя для этого целый арсенал технологий со сложными названиями вроде фильтров Байесса или нечётких сигнатур. К сожалению, программы мгновенных сообщений, такие как ICQ, до сих пор серьёзно обойдены вниманием разработчиков антиспамерского ПО, и пользователей пока спасают лишь владельцы IM-сетей, контролирующие спам на центральных серверах либо отсекая спамеров, периодически меняя сетевые протоколы (что попутно создаёт проблемы для пользователей альтернативных клиентов вроде Trillian и Jabber-систем, на время теряющих свясь с этими сетями и пользователями проприетарных клиентов).

Ещё более трудная ситуация складывается для веб-мастеров публичных ресурсов. Как только веб-сайт обретает достаточную популярность, его коммьюнити-средства -- форумы, доски объявлений, вики и гостевые книги -- наводняются такими же сообщениями, которые всякий среднестатистический пользователь ежедневно в некотором количестве выгребает из почтового ящика. Веб-мастеры не располагают готовыми средствами, оставаясь с этой проблемой, как правило, один на один.

До недавнего времени самым простым и действенным решением проблемы "спама гостевых книг" (когда автоматические роботы публикуют в форумах, гостевых книгах и других подобных ресурсах коммерческую рекламу или ссылки на определённые сайты с целью повысить их индекс цитирования) было введение обязательной регистрации пользователей: прежде чем получить возможность публиковать сообщения, пользователь должен зарегистрироваться на сайте и, возможно, подтвердить указанный при регистрации email. Такое решение имеет и свою оборотную сторону: не каждый человек захочет тратить время на регистрацию, чтобы задать в форуме один единственный вопрос.

Альтернатива этому методу -- планомерная ежедневная чистка ресурса от мусорных сообщений. Обычно, когда объём спама превышает некоторый лимит терпения или после особо отъявленных спамерских атак, от такого способа отказываются в пользу первого.

Повесть о настоящем человеке

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

Методика таких тестов была придумана "отцом" современной вычислительной техники Аланом Тьюрингом. Суть теста Тьюринга заключается в создании задачи, для решения которой компьютеру требуются существенные вычислительные ресурсы в сравнении с лёгкостью решения той же задачи человеком, и обычно сводится к распознаванию образов (согласно известному афоризму, не в пример компьютеру, отличить кошку от собаки по внешнему виду может даже трёхлетний ребёнок).

Вероятно, самый простой вариант такого подхода, -- это статичная картинка с сильно зашумлённым (растянутым, перевёрнутым, искривлённым) текстом, размещённая рядом с формой для публикации сообщения. Кроме самого сообщения посетитель должен перепечатать в специальное поле этот зашумлённый текст, который при отправке сообщения будет сравнен с эталоном. Этот вариант хорош до тех пор, пока ваш форум в силу популярности, например, не становится предметом целенаправленных атак спамеров: когда спамер-человек вручную укажет своей программе текст, который она должна перепечатать в форму, защита перестанет работать.

Более удачный, долговечный и универсальный вариант -- это скрипт, автоматически генерирующий такие уникальные тексты для каждого пользователя. Для преодоления подобной защиты у спамера будет два варианта: либо научить программу решать тест Тьюринга "на лету", либо заставить её находить решение теста "грубой силой", т.е. перебирая все возможные решения. Если скрипт не тривиален, т.е. генерируемый им текст получается достаточно зашумлённым (но, в то же время, и не настолько, чтобы определить текст не смог даже человек), длинным (не одна-две буквы) и случайным (не словарь из пары дюжен слов), то его решение в любом случае превысит возможную выгоду спамера от публикации сообщения в данном форуме и станет просто невыгодным.

Опыт - сын ошибок трудных

Спам начал активно публиковаться в форуме "PGP в России" около полутора лет назад. Поток был невелик, и мы с другими участниками-модераторами успешно его изгоняли, хоть периодически и плевались и размышляли над возможным решением. Сильный всплеск произошёл в конце минувшего года: в некоторых разделах форума появлялись десятки сообщений от незарегистрированных пользователей -- спамовых роботов. Примерно на месяц в форуме пришлось ввести обязательную (вернее, принудительную) регистрацию. А полным решением проблемы, позволившим оставить форум открытым и, одновременно, отсечь роботов, стал скрипт freeCap.

freeCap -- это реализация концепции CAPTCHA (от Completely Automated Public Turing test to Tell Computers and Humans Apart, т.е. полностью автоматизированный публичный тест для разделения компьютеров и людей): скрипт генерирует сильно зашумлённую картинку с некоторым случайным текстом, который, тем не менее, человек способен различить, чтобы доказать свою человеческую сущность. Этот мощный бесплатный скрипт нашёл широкое применение как на сайте "PGP в России", так и в этом блоге, тоже пострадавшем однажды от спамеров. И внедрить его в создаваемую или установленную систему не составит труда ни одному веб-мастеру, имеющему хотя бы поверхностное представление о программировании на PHP.

Установка достаточно проста. Во-первых, нужно скачать архив с последней версией скрипта. Распакуйте его, внесите необходимые на ваш взгляд настройки в файл freecap.php и загрузите на свой сервер.

Второй шаг -- привязка скрипта к веб-приложению. Для этого вам потребуется внедрить в код своей программы три фрагмента php-кода, ответственных за обработку теста. Первый из них -- это обработчик сессии. Его разумно включить в ту часть кода вашего приложения, которая берёт на себя формирование или вывод страницы с формой для публикации сообщений.

<?php
// CAPTCHA session start
session_start();
if(!empty($_SESSION['freecap_word_hash']) &&
!empty($_POST['word']))
{
if($_SESSION['hash_func'](strtolower($_POST['word'])) ==
$_SESSION['freecap_word_hash'])
{
$_SESSION['freecap_attempts'] = 0;
$_SESSION['freecap_word_hash'] = false;
$word_ok = "yes";
} else {
$word_ok = "no";
}
} else {
$word_ok = false;
}
// CAPTCHA session end
?>


Второй фрагмент представляет собой html-код, который будет выводить автоматически генерируемое скриптом изображение теста Тьюринга и поле, куда пользователь (или особо умный робот) должен будет ввести текст, прочитанный им на картинке. Можно разместить этот код в той же форме, через которую производится публикация сообщений, чтобы за валидацию теста и ввод сообщения отвечал один и тот же скрипт. Впрочем, возможны и иные варианты.

<!-- CAPTCHA input start -->
Введите код подтверждения:<br />
<input type="text" name="word" maxlength="20" /><br />
<img src="/freecap/freecap.php" id="freecap" vspace="5" />
<!-- CAPTCHA input end -->


Третий заключительный фрагмент -- это валидатор теста. Это простое условие, передающее обработку дальнейшим процедурам, если получает в переменной волшебное слово, указывающее на прохождение теста, либо выводящее ошибку. Логично разместить этот фрагмент в скрипте, обрабатывающем форму ввода сообщения, непосредственно перед процедурами, вводящими сообщение в базу данных.

<?php
// CAPTCHA validation start
if ($word_ok != "yes")
{
print"Неверный код подтверждения!";
}
// CAPTCHA validation end
?>


Если ваше приложение (к примеру, форум) допускает добровольную регистрацию пользователей, желательно окружить этот и предыдущий блоки условием, запрещающим вывод и валидацию теста для зарегистрированных участников. Так ваши постоянные посетители смогут сохранить всё удобство общения, не отвлекаясь на решение теста.
Комментарии

Re: No pasaran! Спам в форумах и блогах от сулейман

03.05.2008 21:32

Защита форума от спама должна быть комплексной. Посмотрите вот такую сборку форума с набором модулей от спама
С таким набором модулей спам больше форум не побеспокоит
Оставить комментарий
Заголовок:

Текст:

Ваше имя:

Ваш e-mail:


Код подтверждения: