Honeypot - простая эффективная защита форм на сайте от спама

Honeypot - простая эффективная защита форм на сайте от спама

07 Jul 2022Заметки 1349 ~ 2 мин.

Пост продемонстрирует простую технику, которая поможет вам блокировать спамеров и ботов, атакующих формы вашего веб-сайта

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

Итак, представьте, что у вас есть обычная структура формы, следующего вида:


<form id="form" action="/send">
<label for="name">* Ваше имя:</label>
<input type="text" id="name" name="name" placeholder="Введите имя" required maxlength="100">
<label for="email">* Ваш E-mail:</label>
<input type="email" id="email" name="email" placeholder="Введите e-mail" required>
<input type="submit" value="Отправить" />
</form>

 Т.к. большинство ботов - тупые, у них стоит задача заполнить все поля формы, ведь на форме могут быть различные чекбоксы типа "Соглашаюсь с ..", на этом и строится вся логика "Приманки".

Поэтому если мы немного дополним форму чекбоксом с именем, ну например fax_only, и скроем его с глаз с помощью стиля display:none:

<form id="form" action="/send">
<label for="name">* Ваше имя:</label>
<input type="text" id="name" name="name" placeholder="Введите имя" required maxlength="100">
<label for="email">* Ваш E-mail:</label>
<input type="email" id="email" name="email" placeholder="Введите e-mail" required>
<input type="checkbox" name="fax_only" id="fax_only" value="1" style="display:none;" autocomplete="off" />
<input type="submit" value="Отправить" />
</form>

Как вариант, еще можно скрыть элемент без использования diplay:none, т.к. некоторые боты могут это "учуять":


.hidden {
opacity: 0;
position: absolute;
top: 0;
left: 0;
height: 0;
width: 0;
z-index: -1;
}

Но в большинстве случаев даже display none вполне себе рабочий вариант, если же боты все же будут пробивать защиту можно озадачиться усовершенствованием стилей.

Теперь в форме есть 2 вида данных: реальные поля с нашими входными данными (и возможно защищенными хешами) и наш приманка (лучше всего использовать более менее реальные имена, и не использовать "honeypot" и пр. "приманочные" имена).

На бэкэнде достаточно сделать проверку не было ли заполнено какое-либо из полей «honeypot». Если да, поздравляю, вы поймали спам. Большинство ботов заполнит все поля, не различая их. Если вы предпочитаете выполнить эту проверку на клиенте, в случае формы ajax, то это позволит избежать использования ресурсов сервера для вычисления бесполезных данных (но все равно сохраните проверку и на бэкенде). Когда вы поймаете спам, просто не отправляйте данные и делайте с ними все, что хотите. Пример для Laravel:


public function send(Request $request)
{
if ($request->fax_only){
die();
}

//вроде как не спам
}

Ну или просто проверка $_REQUEST в PHP:


if (isset($_REQUEST["fax_only"]) && !empty($_REQUEST["fax_only"])) {
die();
}

Есть еще более продвинутые варианты реализации "приманки" с помощью JavaScript, но как уже писал выше обычно достаточно и простого варианта, а совершенствовать ее можно по мере того, как боты смогут и будут обходить вашу защиту. 

  

Что думаешь?

Категории
  • PHP 58
  • Заметки 12
  • Флуд 2
  • Nginx 2
  • ИТ новости 2
  • Видео 1
  • Архитектура 0
Делаем из мухи слона

sergeymukhin.com

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