Заметки 3252 ~ 2 мин.

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

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

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

Хотелось бы предупредить заранее, что не стоит рассматривать эту защиту как панацею от всех атак, это скорее дополнительный уровень защиты от спама, а не основной функционал. Возможно для вашего ресурса понадобятся более продвинутые системы, такими как 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 66
  • Заметки 15
  • Безопасность 3
  • Флуд 2
  • Nginx 2
  • ИТ новости 2
  • Видео 1
  • Docker 1
  • Roadmap 1
  • Архитектура 0

Хочешь поддержать сайт?

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

sergeymukhin.com

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

Релизы PHP 8.4

Дата Релиз
8 Июня 2024 Альфа 1
20 Июня 2024 Альфа 2
04 Июля 2024 Альфа 3
16 Июля 2024 Feature freeze
18 Июля 2024 Бета 1
01 Августа 2024 Бета 2
15 Августа 2024 Бета 3
29 Августа 2024 RC 1
12 Сентября 2024 RC 2
26 Сентября 2024 RC 3
10 Октября 2024 RC 4
24 Октября 2024 RC 5
07 Ноября 2024 RC 6
21 Ноября 2024 GA

Что нового?