Три года назад на Хабре была опубликована статья «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