Деловая неделя

Наилучшая система защиты форума от роботов (не мешающая обычным пользователям) - генерировать часть элементов HTML-формы javascript'ом, расположенным за пределами формы.

ЕЖЕНЕДЕЛЬНАЯ РЕКЛАМНАЯ ГАЗЕТА ДЛЯ ПРЕДПРИЯТИЙ «Деловая неделя» (Иркутск)

Технология защиты форума от роботов

Смотрите подробности женские кожаные корсеты купить на сайте.

Защита от почтового спама на больших почтовых серверах, кажется, вполне наладилась. 2-3 ненужных письма в день – это совсем не то, что было когда-то. Хуже обстоит дело с защитой от рассылки спама на форумы, каталоги сайтов и доски объявлений. Потому что форумов и каталогов тысячи, и каждый должен определить стратегию защиты сам. В принципе, защитить форум (блог, доску объявлений) от спама можно легко, но при этом хорошим пользователям будет общаться намного труднее (доказывать "я не робот" захочет не каждый).

В сети существует мнение, что от роботов, рассылающих объявления и комментарии, можно защититься с помощью а) javascript, б) cookie*. Эти варианты предлагаются, чтобы не мучать хороших пользователей в) набором контрольных цифр (капча – http://ru.wikipedia.org/wiki/CAPTCHA) и г) авторизацией.

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

Пример – комментарии на этом сайте (dn.ir2.ru). Чего мы только не пробовали: и переменные сессии использовать, и javascript'ом рисовать контрольные цифры. Всё без толку: роботы расщёлкивали все наши хитрости на раз. Экспериментировать с капчой желания у нас не возникло, так как эти самые роботы, с...ки, в своих же объявлениях пишут, что используют новейшие методы распознавания капчи – лицензионные (!) программы. Так чего зря правильных пользователей мучать. Эксперименты с авторизацией успешно провалились на сайте irkutsk.ir2.ru – там авторизация (cookie-based) для добавления объявлений требуется, но роботам это нисколько не мешает.

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

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

Защита с помощью javascript

Как мы уже говорили, рисовать контрольные цифры с помощью javascript бессмысленно – загрузить и обработать файл js для современного робота не проблема, несколько лишних строк кода. Роботу (или спамеру) надо лишь найти нужный скрипт (в тэге <script) на странице. А нужный скрипт по необходимости располагается либо внутри формы добавления текстов, либо в непосредственной близости от неё (чтобы пользователь заметил контрольный вопрос типа "вычислите и введите в окно сумму 2+3" и ответил на него). Поэтому найти нужный тэг <script в стандартной ситуации роботу несложно.

Мы совершенно случайно создали на сайте irkutsk.ir2.ru нестандартную ситуацию, благодаря чему и получили представление о тупости роботов. Это было сделано отнюдь не в целях защиты, а всего лишь с целью оптимизации трафика посетителей. Там изначально было так, что список рубрик на одной странице выводился дважды: для навигации (в виде ссылок) и в форме добавления нового объявления (в виде элемента SELECT). Список получался больше 300 строк (~20К), а кто ж откажется от возможности облегчить свою страницу на 20К? Мы и не отказались: список в виде ссылок оставили, а SELECT в форме стали собирать javascript'ом из текста первого списка.

С учётом того, что OPTION SELECTED в этом элементе формы постоянно менялся (становился равным рубрике последнего добавленного объявления), очень скоро обнаружилось, что роботы не видят элемента, нарисованного javascript'ом – в приходящих от них объявлениях всегда стояло одно и то же значение элемента "по умолчанию" (у нас это "Без рубрики"). Потому что роботы просто не знают, сколько элементов должно быть в форме (не такие уж они и умные), а вычислять ВЕСЬ javscript, разбросанный по разным местам страницы ленятся (или изобретатели "лицензионных программ распознавания капчи" пока что не додумались до этого).

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

Вывод

1) Использование переменных сессии и куки – самое слабое звено в защите от роботов; даже самые ленивые роботы умеют получать и хранить куки и подделывать http-referer, для этого совершенно не нужен искусственный интеллект.

2) Элементы проверки "человечности" пользователей не нужно помещать внутри HTML форм добавления текстов. Если

• капчу физически расположить на другом конце страницы (и отобразить её внутри формы с помощью CSS – ну, и не называть файл картинки captcha.gif:-),

• а элемент, в который пользователь должен вводить контрольные цифры, рисовать внутри формы javascript'ом (например, по событию body onload – т.е. функция javscript, генерирующая элемент, может находиться чёрт знает где),

роботы просто не будут знать, что именно им надо распознавать.

3) Любой элемент формы может стать контрольным, если его рисовать неизвестно где расположенной (не внутри HTML формы) функцией javascript. В этом случае элемент не будет индексироваться поисковыми системами (они ведь тоже роботы) – ну так это только к лучшему, формы и так надо помещать в noindex. Пока среди роботов не распространилась практика парсить весь javascript страницы целиком, такой вариант (один из элементов формы генерируется, остальные статические), пожалуй, будет для роботов наихудшим (существенно хуже, чем целиком рисовать форму javascript'ом).

4) Для защиты от существующих роботов, кажется, вполне достаточно целиком генерировать форму добавления текстов javascript'ом (что и делается на некоторых форумах).

===========================

*

а) javascript: пользователь видит на странице инструкцию "сосчитайте 2+3 и введите полученное число в следующее поле". Если это простой текст, робот тоже может его прочитать, найти цифры, используя регулярные выражения, и вычислить результат. Можно выражение "2+3" записать в виде такого, например, кода:

<script type='text/javascript'>
function h2d(h) {return parseInt(h,16);}
document.write(String.fromCharCode(h2d('32'),h2d('2B'),h2d('33')));
</script>

Тогда роботу будет недостаточно одного регулярного выражения для вычисления ответа – ему нужно будет интерпретировать javascript, что принципиально сложнее.

б) cookie: при открытии главной страницы сайта ваш php-скрипт отправляет браузеру короткую инструкцию:

setcookie("proverka", "случайное число");

После этого браузер, если он не робот, должен будет с каждым запросом отправлять на сервер пару "proverka=случайное число". Принимающй тексты от пользователей скрипт проверяет, прислал ли браузер эту проверочную пару. Прочитать куки и отправлять их потом с запросами на сервер – гораздо более простая задача для робота, чем распознавать javascript.

© 2009, «Деловая неделя», Михаил Гутентог

Читать все комментарии (12)

90. Админ

Забавно, но, кажется, тупые спамеры внимательно читают статьи о веб-технологиях: стоило написать, что защита в комментариях на этом сайте такая же, как и в статьях, – и в комментарии тут же повалили роботы.

23.11.2009 19:25:46

490. Админ

Забавно, но, кажется, тупые спамеры внимательно читают статьи о веб-технологиях: стоило написать, что защита в комментариях на этом сайте такая же, как и в статьях, – и в комментарии тут же повалили роботы.

23.11.2009 19:25:46

491. D.M., admin

Впрочем, возможно, статьи читают сами роботы, а спамеры тут вовсе ни при чём.

23.11.2009 19:38:54

91. D.M., admin

Впрочем, возможно, статьи читают сами роботы, а спамеры тут вовсе ни при чём.

23.11.2009 19:38:54

92. Админ

Попробуем теперь вовсе убрать "проверочные слова" при добавлении комментариев.

25.11.2009 22:05:02

498. Админ

Попробуем теперь вовсе убрать "проверочные слова" при добавлении комментариев.

25.11.2009 22:05:02

93. Админ

Посмотрим, как быстро роботы сообразят, что их опять надули.

25.11.2009 22:07:15

499. Админ

Посмотрим, как быстро роботы сообразят, что их опять надули.

25.11.2009 22:07:15

94. Админ

И, кстати говоря, в форме добавления статей тоже кое-что изменилось. Пробуем использовать технологию защиты, описанную в этой статье (javascript, расположенный неизвестно где, рисует один из элементов формы).

25.11.2009 22:15:49

500. Админ

И, кстати говоря, в форме добавления статей тоже кое-что изменилось. Пробуем использовать технологию защиты, описанную в этой статье (javascript, расположенный неизвестно где, рисует один из элементов формы).

25.11.2009 22:15:49

177. bifurcator

Я у себя так сделал: Текст проверки человечности нарисован в флешке, которая вызывает java-script функцию, рисующую в форме submit кнопку и поле ввода проверочного текста. Получается, что даже если у робота и включенa java, то он не увидит субмит кнопки и поля ввода проверочного текста. А в браузере флешка вызовет функцию, которая для пользователя их нарисует.

11.11.2010 05:07:25

178. Сказка

Ну, а что помешает роботу "включить" Flash Player и получить оттуда инструкцию для javascript?

14.11.2010 02:26:24

Добавить комментарий:

*Автор:
E-Mail:
*Текст: