В последние пять лет сайты все более динамичны. Нас уже приучили к журналам (weblog или просто blog), социальным сетям и прочей канители. Почти на любом сайте есть возможность прокомментировать что-то, отправить запрос и т.д. – в общем просто добавить какую-либо информацию. И все вроде было бы хорошо, если бы не люди, для которых мы это делаем. В семье не без урода. Если есть возможность добавить информацию начинается эра вредоносной информации – СПАМ. Люди пишут роботов ради бесплатной рекламы. Большая часть такой рекламы уходит в никуда, однако отклики на нее все равно есть. Откликается лишь небольшой процент из тех кто смог такую рекламу увидеть, однако этот процент с лихвой окупает затраты по разработке спам роботов и прочих расходов на СПАМ-деятельность.

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

Сначала о мнениях по защите от спама

Мнения сильно различаются. Одни думают, что главный пользователь и заставлять его делать лишние телодвижения – как, например, ввод цифр с картинки нельзя. Другие делают сложнейшие картинки, на которых и человек не всегда разберет надписи, которые включают не только цифры, а так же буквы , а иногда и другие знаки. Таким владельцам сайтов плевать на то что они потеряли пару процентов пользователей – их волнует час-два сэкономленного на разборе спама времени. Так кто же из них прав? Вопрос всегда будет оставаться открытым – сколько людей столько и мнений.

Мое мнение

Я согласен с теми, кто считает, что главный пользователь, но мне так же жалко собственного мнения. Если вы заметили – на этом блоге не стоит CAPTCHA

Большую часть времени я разрабатываю сайты, на большинстве из которых требуются формы отправки письма владельцам этих самых сайтов. Никто из владельцев этих сайтов не хотел бы получать тонны спама в день с этих самых форм. Как быть? Основная аудитория таких сайтов не очень продвинуты в использовании компьютера и интернет, и обычная CAPTCHA их просто испугает, а заказчик не хочет терять ни одного потенциального клиента!

Решения проблемы без CAPTCHA

То, что нужно усвоить в первую очередь – для пользователя все должно быть просто и прозрачно! Никаких лишних просьб посетителю сайта! Никаких лишних телодвижений! Пользователь должен открыть форму , написать запрос, нажать кнопку отправки сообщения и со спокойной душой быть полностью уверенным, что его сообщение доставлено адресату.

Самое первое, что мы можем сделать, это не верстать форму в HTML-коде. Мы будем создавать ее при помощи JavaScript! Все помнят document.createElement , node.setAttribute, node.appendChild ? Вот это наши основные инструменты! Отправлять форму следует только методом POST – это аксиома!!! Использовать для отправки формы обычный метод тоже не стоит! Мы будем использовать AJAX – так надежнее, да и трафика меньше! Помните? Еще не у каждого в нашей огромной стране UNLIM!

Итак, создаем форму динамически на клиенте, отправляем постом через AJAX. Но опасность еще не миновала. Еще одна мера защиты – сформировать input type=text и выставить у него display:none – робот обязательно его заполнит, т.к. будет заполнять все! Реальный пользователь его заполнить просто не сможет – т.к. не увидит его. Делаем проверку на то, что поле пришло пустым! Помните? ПРИШЛО!!!! Если не пришло совсем – это снова робот!

Однако роботы умнеют на глазах! Они могут быть сделаны специально под ваш ресурс!!! Обходим эту проблему: после создания формы формируем запрос к серверу на вставку в страницу одного из нескольких файлов js, в которых содержится функция handleForm – но ее алгоритм во всех файлах разный. Запрос направляется к одному и тому же урлу, однако серверная часть сама решает какой из алгоритмов отдать. Запоминаем отданый алгоритм на сервере….

Далее отправляем серверу запрос на подпись формы. Сервер фомирует строку подписи, она вставляется в форму при помощи input type=hidden – опять динамически. Но перед вставкой обрабатывается тем самым алгоритмом , который содержится в функции handleForm. Когда форма приходит на сервер, тот помнит какую строку подписи он давал клиенту и какой алгоритм шифрации. Он шифрует выданную строку выданным алгоритмом и сравнивает со строкой полученной от пользователя.

Клиент – есть браузер, но человек ли?

Строки совпали? Отлично! Мы уже уверены, что это полноценный браузер! Однако полной уверенности, что это реальный пользователь пока нет! Возможно это плагин для Firefox написаный специально под вас!

Посылаем клинету ответ! Клиент (браузер), приняв ответ о доставке сообщения (пока только на сервер) показывает пользователю окно, что сообщение отправлено, и…….
Дальше действия могут различаться. Либо, когда пользователь закроет модальное окно на JavaScript, либо только тогда, когда он перейдет на следующую страницу сообщение будет действительно отправлено владельцу сайта.

Да, да такая вот многоуровневая защита. Теперь мы почти уверены, что это не бот!

Комменты

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