Веб-разработка / Защищаем веб-формы от спама без CAPTCHA — 2: Ботобор

в 16:14, , рубрики: captcha, спам, юзабилити, метки: , ,

Три года назад на Хабре была опубликована статья «Form Spam Bot Blocker: Защищаем Web-формы без CAPTCHA!», рассказывающая о принципиально отличном от CAPTCHA решении для PHP по защите форм от спам-ботов. Это решение основано на идеях, изложенных в своих статьях Филом Хааком (Phil Haack) — Honeypot Captcha и Недом Батчелдером (Ned Batchelder) — Stopping spambots with hashes and honeypots. К сожалению, предложенный в статье класс, написан для PHP4 и не развивается с 2007-го года. Хочу предложить вашему вниманию его аналог на PHP5.

Ботобор

<a rel="nofollow" href="https://github.com/mekras/botobor">Ботобор — библиотека, написанная на PHP 5.0, предназначенная для защиты от заполнения веб-форм роботами. Используемые ей методы, незаметны для посетителей-людей.

Для выявления роботов Ботобор использует следующие проверки:

  • несовпадение значения REFERER с URL, на котором расположена форма;
  • слишком маленький промежуток между показом формы и её отправкой (настраивается);
  • слишком большой промежуток между показом формы и её отправкой (настраивается);
  • заполнение поля-приманки.

По умолчанию используются все проверки, но у разработчика есть возможность отключать любые из них.

Примеры

Простой пример

Фрагмент кода, создающего форму:

require 'botobor.php';

// Получите разметку формы тем способом, который предусмотрен у вас в проекте, например:
$html = $form->getHTML();
// Создайте объект-обёртку:
$bform = new Botobor_Form($html);
// Получите новую разметку формы
$html = $bform->getCode();

Фрагмент кода, обрабатывающего данные формы:

require 'botobor.php';

if (Botobor_Keeper::isHuman())
{
  // Форма отправлена человеком, можно обрабатывать её.
}

Пример настройки формы

Фрагмент кода, создающего форму:

// пусть $html содержит код формы
$bform = new Botobor_Form($html);
// отключаем поля-приманки
$bform->setCheck('honeypots', false);
// устанавливаем нижний предел заполнения формы в 2 секунды
$bform->setDelay(2); 
// устанавливаем верхний предел заполнения формы в 60 минут
$bform->setLifetime(60);
$html = $bform->getCode();

В остальном всё также как и в первом примере.

Что у ней внутре?

Что делает Ботбор с кодом формы

В конструкторе Botobor_Form принимает HTML-код формы. В этот код, после открывающего тега <form>, добавляется скрытый (display: none) <div>, содержащий input[type=hidden] с мета-данными формы. Эти мета-данные хранят подписанную информацию о времени создания формы, установленных опциях и т. д. В этот же скрытый блок Ботобор может вставлять поля-приманки.

Поля-приманки

Поля-примнаки предназначены для отлова роботов-пауков, которые находят формы самостоятельно. Такие роботы, как правило, ищут в форме знакомые поля (например, name) и заполняют их. Ботобор может добавить в форму скрытые от человека (при помощи CSS) поля с такими именами. Человек оставит эти поля пустыми (т. к. просто не увидит), а робот заполнит и тем самым выдаст себя.

По умолчанию в коде формы ищутся поля с любым из следующих имён: «name», «mail», «email» (список настраивается). У каждого найденного поля имя меняется на сгенерированную случайным образом комбинацию символов и создаётся скрытое средствами CSS поле с оригинальным именем.

Обратное преобразование имён будет сделано во время вызова метода Botobor_Keeper::handleRequest() или Botobor_Keeper::isHuman().

Буду рад, если кому-то пригодится.

Автор: Mekras

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js