ICQ214-697-723 | Emailinfo@mainsource.ru | Телефон(812) 946-31-81
Все контакты
Автор статьи
Алексеев Андрей
Оригинальная защита от спама средствами AJAX

Оригинальная защита от спама средствами AJAX на примере проекта, построенного на фреймворке Ruby on Rails

Для того, чтобы защитить систему от спама, надо, прежде всего, понять, как работают спамилки. Итак, бот заходит на вашу страничку, на которой есть форма отправки сообщения и ищет код этой формы в исходном коде страницы. Когда он находит соответствующий тег <form> он берет из него атрибут action, чтобы знать куда ему сабмитить форму и собирает информацию по поводу полей этой формы.

Далее спам-бот просто посылает информацию на страницу, взятую из атрибута action, post- или get-методом, заканчивая свое «черное» дело. Возможно, на пути робота встанет CAPTCHA, но уже давно у современных спам-ботов есть алгоритмы по взлому всех стандартных картинок защиты.

Остается либо установить сложную CAPTCHA, либо придумать какой-то оригинальный способ защиты. Мы поговорим о втором способе, так как о первом (установка CAPTCHA) уже много сказано в интернете.

Идея метода заключается в том, чтобы скрыть от спам-бота код формы отправки сообщения, таким образом у него даже не будет информации о том, есть ли на данной странице форма отправки сообщения (комментария) или нет. Изначально формы на странице не будет и она будет подгружаться AJAX-ом (Asynchronous Javascript and XML — «асинхронный JavaScript и XML») по требованию пользователя, решившего оставить комментарий.

Вид формы для бота
Так выглядит область страницы, где можно оставить комментарий.

То есть изначально на этой странице нет формы для отправки сообщения, она появится позже.

Код вышеописанной области в данный момент выглядит так:

<input type="button" value="Комментировать" onclick="new Ajax.Updater('form', '/photo/show_form/53', {asynchronous:true, evalScripts:true}); this.style.display='none'; return false;"/>
<div id="form"></div>

Обратите внимание на теги <div id="form"></div>, в них в последствии будет вставлена форма комментирования.

Код на сервере, который отвечает за вывод кнопки "Комментировать" следующий:

<input type="button" value="Комментировать" onclick="new Ajax.Updater('form','/photo/show_form/<%=photo.id%>', {asynchronous:true, evalScripts:true}); this.style.display='none'; return false;"/>
<div id="form"></div>

При нажатии на кнопку ”Комментировать” идет асинхронное обращение (без перезагрузки страницы) браузера к серверу, с которого загружается наша форма.

Сервер, получив запрос выполнит соответствующий код:

def show_form
@photo_id = @params[:id]
render_partial 'form', @photo_id
end

, который отправит в браузер пользователя сгенерированную форму из файла _form.rhtml

<form action="/comment/create" method="post" onsubmit="new Ajax.Updater('comments', '/comment/create', {asynchronous:true, evalScripts:true, insertion:Insertion.Top, parameters:Form.serialize(this)}); document.getElementById('author').value=''; document.getElementById('comment').value=''; return false;">
<table>
<tr>
<td style="padding:0;padding-bottom:10px;">
<b>Автор:</b><br/>
<%= text_field_tag :author %>
<%= text_field_tag :photo_id, @photo_id, {:style => "display:none"}%>
</td>
</tr>
<tr>
<td style="padding:0;padding-bottom:10px;">
<b>Комментарий:</b><br/> <%= text_area_tag :comment, nil, { :cols => "50", :rows => "5" }%>
</td>
</tr>
<tr>
<td style="padding:0;padding-bottom:10px;">
<%= submit_tag "Добавить", :onclick => "return check();" %>
</td>
</tr>
</table>
</form>

, а браузер в свою очередь вставит эту форму в div с идентификатором form, о котором говорилось выше.

В результате в окне браузера мы увидим форму отправки комментария.

Форма после подгрузкти кода
Так выглядит область страницы, где можно оставить комментарий после описанных действий по подгрузке кода формы.

Однако, в коде страницы по-прежнему не будет кода формы:

<input type="button" value="Комментировать" onclick="new Ajax.Updater('form', '/photo/show_form/53', {asynchronous:true, evalScripts:true}); this.style.display='none'; return false;"/>
<div id="form"></div>

Таким образом, спам-бот злоумышленника не сможет определить параметры формы, необходимые для спама, в автоматическом режиме. Такой метод можно обойти вручную, просмотрев DOM-дерево с помощью JS (JavaScript) через строку браузера либо плагинами к разным браузерам, и выудив нужные параметры. Но, таким мало кто станет заниматься, тем более для этого нужны соответствующие знания, так что данный метод можно считать достаточно стойким к спаму.

К тому же, в базу спам-ботов сайт с такой защитой не попадет, так как, когда его будут сканировать на наличие форм обратной связи, скан-бот просто не найдет таковой на этом сайте.

По своему опыту могу сказать, что, имея 3 проекта с такой защитой в течении 2 лет они ни разу не подвергались атаке спам-ботов.

Удачи вам при защите своих сайтов и сайтов заказчиков от спама!

Опубликовано в сентябре 2009 года.

Denis [30.01.2011 08:14]
Спасибо, интересная статья. Я у себя немного по другому реализовал. Я оставил форму обратной связи в коде страницы, но она не имеет кнопочки submit. То есть кнопка есть, но обычная картинка, при нажатии на которую включается обработчик формы на ajax и отправляет форму другому скрипту. Конечно можно передать данные напрямую нужному скрипту если подсмотреть код. Но этим никто не занимается.
Владимир Богдановский [06.02.2011 01:23]
Увы, но эти решения подвластны ботам.
Всегда можно написать робота, который будет эмулировать аджакс-запросы, а также не трудно выяснить подгружаемый код.

Единственно, тут конечно ставится барьер, под который ботам нужно подстраиваться и программисту писать определнный код под данную форму.

Чем больше барьеров, тем меньше  процент потенциальных ботов.

Любое препятствие - это плюс несомненно. Важон только, чтобы это не мешало целевому пользователю формы

Перейти к списку статей

АкцияИнтересные акции и предложения

Эксклюзивный сайт на UMI.CMS — 40 000 рублей, абсолютно все включено! Значительно дешевле!

полный список

Наши специалисты имеют высшее образование в сфере компьютерных технологий, а также многолетний опыт работы по своим направлениям.

Мы постоянно повышаем квалификацию наших сотрудников и расширяем список IT-технологий с помощью которых могут быть реализованы любые Ваши задачи.

вакансии Вакансии партнеры Партнеры
отзывы Отзывы сотрудники Сотрудники
faq Вопросы и ответы

Реализованные проекты

vzemle.ru Буровой сайт
Информационный сайт на базе CMS 1С-Битрикс "под ключ".
pro-tours.ru Форум под ключ
Туристический портал для общения, реализованный на популярном движке.

другие

MainSource