Тема защиты форм от спам-ботов будет актуальной, наверное, всегда. Самым популярным инструментом на сегодня, пожалуй, является ReCAPTCHA от Google. Однако с ней есть некоторые сложности.
В данный момент ReCAPTCHA представлена в двух версиях: v2 (с кнопкой "Я не робот") и v3 (невидимая). Проблема версии с кнопкой состоит в том, что спамеры научились ее обходить. А проблема 3-й версии — в том, что, как ее ни настраивай, она может не пропустить заполненную форму от живого пользователя. В нашей практике не раз были случаи, когда заказчики жаловались на то, что их клиенты не могут отправить какую-нибудь форму на сайте из-за того, что ReCAPTCHA 3-й версии считала их активность подозрительной. Поэтому мы стараемся не прибегать к этому инструменту без особой необходимости.
Для замены рекапчи мы применяем свое достаточно простое решение. Разберем на конкретном примере.
Дано: форма обратной связи с полями:
- Имя
- Телефон
- Комментарий
- Согласие на обработку персональных данных
- Все поля, кроме "Комментарий", обязательные.
Чтобы роботы не могли отправить такую форму, нужно добавить в нее фейковое поле, которое будет видно только им. Это поле будет присутствовать в HTML-разметке страницы, но не будет видно обычному посетителю. Если данное поле отправляется на сервер заполненным, сервер такую форму не должен принимать. Уловка в том, что большинство ботов заполняют все поля без разбора, поэтому данный метод сработает в большинстве случаев.
Чтобы максимально усложнить выявление роботами такого поля, оно должно максимально походить на настоящее, поэтому рекомендуется соблюдать ряд условий:
Поле должно быть максимально похожим на поле для ввода Email, так как такие поля почти всегда заполняют роботы. То есть, в HTML-коде формы должно появиться дублирующее поле Email с точно такой же разметкой, что и настоящее поле.
Дублирующее поле должно стоять до настоящего, чтобы наверняка стриггерить робота на его заполнение.
Для скрытия дублирующего поля нужно добавлять дополнительный класс, название которого никак не должно намекать на то, что поле скрыто. По этому классу в CSS должно быть прописано свойство visibility: hidden. Не рекомендуется добавлять это свойство в inline-стилях.
Фейковое поле не должно быть обязательным к заполнению. Очевидный факт, но на всякий случай стоит проверить.
Проверка на заполнение фейкового поля должна производиться на сервере, а не на клиенте, потому что JS-проверка для робота работать не будет.
В качестве примера приводим разметку формы для сайта 1С-Битрикс: Управление сайтом.