mekras/botobor 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

mekras/botobor

Composer 安装命令:

composer require mekras/botobor

包简介

PHP antispam library

README 文档

README

Build Status

[ Домашняя страница ] [ Документация по API ]

Принципы работы

Самый распространённый на сегодняшний день способ защиты веб-форм от роботов — заставить пользователя доказать, что он человек, путём выполнения действий, которые роботу выполнить затруднительно (CAPTCHA). Вот только с точки зрения удобства использования это не очень хорошо. Ведь таким образом мы заставляем пользователя выполнять ненужные ему и не всегда простые действия.

Нед Батчелдер предлагает зайти с другого конца. Вместо того, чтобы заставлять напрягаться наших любимых, но ленивых пользователей разбирать, заставить роботов выдать себя. Подробно об этом написано в его статье Stopping spambots with hashes and honeypots.

Ботобор представляет собой библиотеку PHP, реализующую идеи Неда. На данный момент используются следующие проверки (любая из них может быть отключена):

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

Кто может сказать: «Эй, да это же всё обходится в два счёта!». Конечно, так и есть. Но Ботобор не ставит своей целью абсолютную защиту (да такое и невозможно). Цель Ботобора скромнее — уменьшить вероятность заполнения формы роботом, не напрягая при это пользователей-людей. Кстати, Ботобор и CAPTCHA могут использоваться вместе: Ботобор в качестве первой линии обороны, CAPTCHA в качестве второй, если остаются сомнения в человечности пользователя. Подробнее об этом будет написано ниже.

Установка

Во-первых, Вы можете просто скачать файл botobor.php и подключить его к своему проекту любым удобным Вам способом.

Во-вторых, можно использовать composer:

php composer.phar require mekras/botobor:~0.4.0

Использование

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

Код PHP, создающий форму:

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

Код PHP, обрабатывающий форму:

<?php
require 'path/to/botobor.php';
...
if (Botobor_Keeper::get()->isRobot())
{
    // Форма отправлена роботом, выводим сообщение об ошибке.
}

Пример с опциями

Можно менять поведение Ботобора при помощи опций. Например, для форм комментариев имеет смысл увеличить параметр lifetime (наибольший промежуток между созданием и отправкой формы), т. к. посетители перед комментированием могут долго читать статью.

Это можно сделать так:

<?php
$bform = new Botobor_Form($html);
$bform->setLifetime(60); // 60 минут

Подробнее об опциях см. описание методов setCheck, setDelay и setLifetime в документации API.

Пример с приманкой

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

В этом примере поле «name» будет сделано приманкой. При этом имя настоящего поля «name» будет заменено на случайное значение. Обратное преобразование будет сделано во время вызова метода Botobor_Keeper::handleRequest (вызывается автоматически из Botobor_Keeper::isRobot).

$bform = new Botobor_Form($html);
$bform->setHoneypot('name');

Определение провалившейся проверки

Иногда может потребоваться узнать, почему именно Ботобор решил, что посетитель — робот, какую именно проверку посетитель не прошёл. Для этого можно воспользоваться методом Botobor_Keeper::getFailedCheck(), который возвращает имя проваленной проверки. Имена проверок указаны в документации по API.

Совместное использование с CAPTCHA

Ботобор может использоваться совместно с CAPTCHA. Один из вариантов может быть таким. Если проверка Ботобором показала, что форму заполнил робот, можно поступить так же, как в похожей ситуации поступает Яндекс — запросить ввод кода с картинки. В коде это может выглядеть как-то так:

<?php
function checkRequest()
{
    // Проверяем, использовался ли CAPTCHA в этом запросе
    if ($someCaptcha->isUsedInThisRequest())
    {
        /*
         * Попадание сюда говорит о том, что посетитель уже проходил, но не прошёл проверку
         * Ботобором и сейчас проходит проверку CAPTCHA. По итогам этой проверки мы либо признаём в
         * посетителе человека, либо окончательно отказываем ему.
         */
         if (!$someCaptcha->isPassed())
         {
             $this->showErrorNotify();
         }
    }
    elseif (Botobor_Keeper::get()->isRobot())
    {
        /*
         * Попадание сюда горовит о том, что посетитель не прошёл проверку Ботобором. На случай если
         * это было ложное срабатывание, мы дадим посетителю возможность пройти CAPTCHA, чтобы
         * доказать, что он не робот.
         */
         $this->showCaptcha();
    }

    // Посетитель — человек, можно обрабатывать его запрос
    $this->processRequest();
}

mekras/botobor 适用场景与选型建议

mekras/botobor 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 36.46k 次下载、GitHub Stars 达 21, 最近一次更新时间为 2013 年 05 月 23 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 mekras/botobor 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 mekras/botobor 我们能提供哪些服务?
定制开发 / 二次开发

基于 mekras/botobor 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 36.46k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 22
  • 点击次数: 10
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 21
  • Watchers: 6
  • Forks: 5
  • 开发语言: PHP

其他信息

  • 授权协议: Apache-2.0
  • 更新时间: 2013-05-23