Как стать автором
Обновить

Как повысить уверенность в том, что кнопка была нажата живым пользователем на сайте и избавиться от капчи?

Время на прочтение6 мин
Количество просмотров35K
Капча всем известна. Также всем известно, что она представляет собой большую проблему и для программистов и для пользователей. Она ни тем ни другим не нравится! Ее приходится использовать по необходимости!

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

Последний предлагаемый метод спорный, но судите сами!

Метод переменных полей


Имеем простую форму с кнопкой типа submit.

Это самый простой, канонический вариант. Мы заполняем форму, нажимаем кнопку типа submit, и элементы формы передаются какому-то скрипту тем или иным методом для обработки.

Спаммер не напрягается с заполнением полей, а сразу, напрямую, вызывает нужный скрипт с нужными параметрами. В этом случае определить, человек нажал на кнопку, или скрипт вызван напрямую затруднительно.

Возможные методы борьбы

Нужно, чтобы имена полей в форме не имели смысловой нагрузки. Не имели названий "name", "last-name", "tel", "mail" и так далее. Роботизированные спаммерские скрипты ориентируются именно на это. По моему опыту наблюдения за спаммерскими роботами, они заполняют те поля, которые знают, как заполнить, а те поля, где затрудняются, оставляют пустыми, или вставляют козырную фразу «Antispam SUXXX». За долгие годы испытаний ни один робот не заполнил у меня в испытательной форме поле «ntspm». Другими словами, если сделать форму всего с одним важным, но непонятным для робота полем, например, вместо поля с именем «login» использовать имя «l__in_001», то это поле робот заполнить не сможет. По крайней мере вероятность этого довольно велика.

Можно пойти дальше и запрограммировать свои формы так, что названия полей будут меняться каждый день. Например, можно брать нормальное имя поля, например, «telephone», прибавлять к нему «отпечатки пальцев» в виде сегодняшнего числа, брать от получившейся строки md5-хэш, как самый производительный из хэшей, и использовать его в качестве имени поля за указанное число.

Программируется это все один раз, работает постоянно, и это реальный метод избавления от роботов.

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

Метод аяксовой кнопки


Простая форма. Все как в методе «переменных полей», но обрабатываемая аяксом. Кнопка, которая раньше была типа «submit», теперь у нас имеет тип «button». По нажатии на кнопку срабатывает скрипт JavaScript, который отсылает всю форму сразу, или отдельные поля этой формы на сервер.

В чем суть защиты? В том, что роботы не умеют закачивать и обрабатывать скрипты JavaScript. Роботы — звери серверные, а скрипты JavaScript — звери клиентские. Тут идет нестыковочка технологий. Звери наши живут в разных клетках. И этот метод не дал ни одной осечки на моем сайте статей. Он прекрасно работал и работает до сих пор. Но есть нюанс.

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

Но метод «аяксовой кнопки» можно комбинировать с методом «переменных полей», что однозначно усилит защиту до вполне адекватных величин.

Метод «аяксовой кнопки» можно дополнительно усилить. Мы можем каждый раз обращаться к нашему бэкенду по новому имени. Мы можем менять имя бэкенда каждый день подобно тому, как выше предлагалось менять имена полей. Наверное, менять имя бэкенда даже проще. Представьте себе, для того, чтобы вас заспамить, нужно будет каждый день вручную вносить изменение в скрипт. Нет, я не думаю, что кто-то будет этим заниматься.

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

Метод, который я назвал бы «разрешите войти»


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

Перед тем, как углубляться, хочу немного отвлечься.

Отступление № 1

Давайте предположим, что у нас на форме есть hidden input. Перед тем, как отправить форму на сервер, мы заполняем этот инпут чем-то и по наличию этого «чего-то» мы и судим — робот у нас был или человек. Предлагаемый ход — это некоторое видоизменение метода «аяксовой кнопки». Суть в использовании клиентского скрипта, который недоступен роботу. Но мы сразу вынуждены заметить, что метод будет хорошо работать, только если содержимое этого поля всегда будет разное. Не так ли работает обычная капча?

Отступление № 2

К моей предыдущей статье про методы защиты сайта на публичном хостинге было дано много комментариев. Некоторые из них имели тот лейтмотив, что бороться со взломом невозможно, ибо вас всегда взломают, если кому-то это действительно нужно. Я согласен с этим выводом, но не согласен с тем, что не нужно бороться! Точно такой же лейтмотив присутствует на форумах автосигнализаций. Там ситуация очень похожая. Суть тамошней уязвимости в том, что вы нажимаете на кнопку брелка, код ваш перехватывается приемником из соседней машины с тонированными окнами, глотается им, код охраны подменяется и ваш автомобиль ставится на охрану чужим кодом! Все! Грош цена вашей сигнализации! Тогда наши коллеги из сферы автосигнализаций придумали следующий метод решения проблемы. А что, если брелок будет посылать на автомобиль не команду "Встать на охрану с кодом таким-то", а вопрос "Можешь ли ты встать на охрану с кодом таким-то?" И если ответ положительный, то автосигнализация отвечает. "Становлюсь на охрану с этим кодом и посылаю его обратно для проверки". Брелок проверяет совпадение кода посланного, присланного обратно, и если они совпадают, то машина стоит на охране с вашим, а не с чужим кодом. Задача решена. А если не совпадают, то запрос нужно просто повторить. Автолюбитель этого даже не узнает.

Может похожий метод решить вопрос капчи?

Я попытался!

Укрупненный алгоритм работы формы

  • Форма заполняется данными.
  • Нажимается кнопка отправки.
  • На сервер аяксом посылается запрос типа «Собираюсь зарегистрировать пользователя.»
  • Сервер регистрирует запрос в базе данных или в простом файле, регистрирует время запроса и время, когда запрос становится недействительным, например, 30 секунд. После этого код запроса в виде строки (хэша) отправляется обратно.
  • Наш клиентский скрипт записывает этот код в наш input hidden с именем «ntspm» и смело отправляет все параметры на сервер.
  • Сервер берет код из хидден параметра. Проверяет его наличие в списке зарегистрированных кодов, проверяет, не истекло ли время, совпадает ли тип операции, и если все совпало — регистрирует пользователя в полной уверенности, что это был живой человек.

Есть слабые места? Да есть. Спаммер может сделать программу, которая будет посылать запрос кода, потом подставлять этот код в свою посылку. Но это будет индивидуальный робот именно для вашего сайта, и что-то мне подсказывает, что для простого сайта, для интернет-магазина и даже для приличного интернет-магазина никто программу такую писать не будет специально. Обломятся! А если мы скомбинируем этот метод с усилителями из предыдущих методов, то можно довести степень распознования робота до очень высокого процента. Боюсь вот так тыкать пальцем в небо, но я бы дал процентов 98,5. Просто потому, что проблем для спаммера столько, что честное слово, легче зайти живому человеку и ручками послать все, что нужно. Капча в случае с живым человеком, понятное дело, не поможет.

Резюме


Мне кажется, что избавиться от капчи можно! Тем самым можно сделать жизнь своих пользователей чуть-чуть легче и попутно повысить конверсию своего сайта.

Я по долгу службы часто захожу в сервис «Подбор слов» от Яндекса. Там теперь на каждый запрос стоит капча. Если это метод замедления работы пользователя, типа "Подумай еще раз! Может тебе эта инфа на самом деле не нужна?", то тогда понятно. Но если это реально защита от роботов, то почему бы не поставить обычную кнопку с надписью «Продолжить» и использовать один из вышеприведенных методов с усилителями?

Давайте сделаем интернет чуть-чуть удобнее!

Ссылки


Мой сборщик спама. Сайт этот не для людей! Его оформление призвано это продемонстрировать. В нем (по ссылке «добавить объявление») реализован метод «разрешите войти» без усилителей. За много лет ни одного «пролета» не было. Но справедливости ради хочу уточнить, что «пролетов» не было и на методе «аяксовая кнопка» без усилителей. Да и роботы всегда меня одни и те же посещают и все они без изысков, что очень жаль.
Теги:
Хабы:
Всего голосов 46: ↑30 и ↓16+14
Комментарии78

Публикации

Истории

Работа

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань