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

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

Заметки 1967 ~ 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, но как уже писал выше обычно достаточно и простого варианта, а совершенствовать ее можно по мере того, как боты смогут и будут обходить вашу защиту. 

  

Что думаешь?

Виталя21.07.2023

Для чекбокса достаточно проверки isset($_REQUEST["fax_only"]), так как если он не выбран, то нет такого элемента в массиве $_REQUEST.

Категории
  • PHP 63
  • Заметки 13
  • Nginx 2
  • ИТ новости 2
  • Безопасность 2
  • Флуд 1
  • Видео 1
  • Docker 1
  • Roadmap 1
  • Архитектура 0

Хочешь слона?

Делаем из мухи слона

sergeymukhin.com

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

Релизы PHP 8.3

Дата Релиз
8 Июня 2023 Альфа 1
22 Июня 2023 Альфа 2
6 Июля 2023 Альфа 3
18 Июля 2023 Feature freeze
20 Июля 2023 Бета 1
03 Августа 2023 Бета 2
17 Августа 2023 Бета 3
31 Августа 2023 RC 1
14 Сентября 2023 RC 2
28 Сентября 2023 RC 3
12 Октября 2023 RC 4
26 Октября 2023 RC 5
9 Ноября 2023 RC 6
23 Ноября 2023 GA

Что нового?