sameer-shelavale/multi-captcha

一包包含多种(7种)CAPTCHA。支持 Gif captcha(动画Gif captcha)、图片 CAPTCHA(用户必须输入图像中显示的某些或全部代码)、HoneyPot captcha(它仅仅添加一个空字段,要求用户将其留空。机器人会填满它)、ASCII captcha(它显示的

v1.3.5 2015-08-28 09:09 UTC

README

正如其名,这是一个渲染所有内容的包!一个包中包含多种类型的 CAPTCHA。有时我们只是需要避免垃圾邮件机器人,同时仍然保持表单对用户友好,有时我们需要完全的保护,即使这可能会使用户使用起来变得复杂。MultiCaptcha 帮助你在项目上拥有统一的 Captcha 验证代码。

主要特性

  1. 支持 7 种 captcha 类型,并为每种类型提供多种配置选项。
  2. 显示刷新按钮(您需要提供刷新 URL)。
  3. 每个 Captcha 挑战只能提交一次。
  4. 可自定义错误消息
  5. 您可以使用 themeOptions 自定义外观和感觉,或者您可以编写自己的主题。

支持的 CAPTCHA 类型

安装

使用 Composer

命令行

您可以使用 Composer 安装 MultiCaptcha,方法如下

composer require sameer-shelavale/multi-captcha

composer.json

或者,您可以直接在 composer.json 文件中的 require 块中添加它

{
    "require": {
        "sameer-shelavale/multi-captcha": "1.3.*"
    }
}

然后运行

composer update

PHP 包含

或者,您可以下载 zip/rar 压缩文件,将其解压并将 /src 文件夹复制到项目文件夹中的适当位置。然后包含 captcha.php

注意:确保缓存目录可写。

include_once( 'PATH-TO-MULTI-CAPTCHA-FOLDER/src/Captcha.php' );

使用方法

初始化

初始化 captcha 所需的最小代码如下

$captcha = new \MultiCaptcha\Captcha([
    'secret'=>    "your-secret-key",
] );

上面的代码将初始化 captcha 对象以输出默认的 "image" captcha。注意:设置您自己的密钥很重要,因为它用于加密和解密 captcha 字段。

更复杂的代码如下

$captcha = new \MultiCaptcha\Captcha([
    'secret'=>    "your-secret-key",
    'life' => 2, //number of hours the generated captcha will be valid
    'customFieldName' => 'my_captcha', //this becomes the name of captcha answer field
    'options' =>  [
        'image' => [
            'maxCodeLength' => 8,
            'font'=>'../src/types/image/comic.ttf',
            'width'=>180
        ]
    ]
] );

现在,我们了解了如何初始化它,让我们详细看看支持的参数。

支持参数

选项

目前我们可以渲染 7 种 captcha 类型,即 imagegifasciimathhoneypotrecaptchanocaptcha。现在让我们详细了解每种类型的支持配置参数。

图片 CAPTCHA
Gif Captcha(GIF 动画 captcha)
ASCII Captcha

ASCII 字体名称:您可以在 src/types/ascii/fonts/ 文件夹中找到当前支持的 ASCII figlet 字体,并使用不带 .flf 扩展名的字体名称。

ASCII captcha 配置示例

$captcha = new \MultiCaptcha\Captcha([
    'secret'=>    "your-secret-key",
    'options' =>  [
        'ascii' => [
            'maxCodeLength' => 8,
            'fonts'=>array(
                'banner' => 4, //render with font size 4px or it becomes too big
                'doom' => 8, //render with font size 8px
                'small' =>'8' //render with font size 8px, "small" font is at src/types/ascii/fonts/small.flf
            )
        ]
    ]
] );

注意,fonts 参数,它使用不带扩展名的字体名称作为键,大小以像素为单位作为值。除非您提供 fontPath 参数,否则它将在 src/types/ascii/fonts/ 文件夹中查找该字体。

数学 CAPTCHA(简单的数学表达式)
HoneyPot Captcha
ReCaptcha

注意:您可以在 http://www.google.com/recaptcha 注册并获取您的 reCaptcha 密钥

Nocaptcha
您可以从配置的多种类型中生成随机类型的 captcha。

例如,您可以这样操作

$captcha = new \MultiCaptcha\Captcha([
    'secret'=>    "your-secret-key",
    'options' =>  [
        'math' => array(
            'description'=> "Answer following question if you are human",
            'level' => 4
        ),
        'image' => array(
            'maxCodeLength' => 8,
            'font'=>'../src/types/image/comic.ttf',
            'width'=>180
        ),
        'ascii' => array(
            'maxCodeLength' => 8,
            'fonts'=>array(
                'banner'=> 4,
                'doom'=> 8,
                'small'=>'8'
            )
        ),
        'gif' => array(
            'maxCodeLength' => 8,
            'font'=>'../src/types/image/comic.ttf',
            'width'=>180,
            'height'=>60,
            'totalFrames'=>50,
            'delay'=>20
        )
    ]
] );

然后它将生成从配置的 4 种类型中随机类型的 captcha

渲染

您可以使用以下单行代码渲染 captcha

echo $captcha->render() ;

这样就完成了。(注意,$captcha 是您初始化的对象名称)

刷新

要显示刷新按钮,必须提供refreshUrl。然后在那个url的脚本中可以进行操作。

echo $captcha->refresh() ;
exit; //this is important to ensure no html is trailing the captcha

注意:确保在captcha->refresh();前后没有显示HTML。您也可以在同一页面上进行渲染和刷新,请参考gif、ascii、图片和数学验证码示例。

验证

您可以通过以下方式简单地验证表单数据

if( $captcha->validate( $_POST ){
    //do further processing, validate individual form fields
}

注意:由于验证码字段的名称是加密和随机的,我们需要将所有提交的数据传递给验证函数。如果您指定了customFieldName参数,则将需要该字段和挑战字段进行验证。例如,如果customFieldName = my_captcha,则需要传递一个数组

if( $captcha->validate( [ 'my_captcha'=>$_POST['my_captcha'], 'my_captcha_challenge'=>$_POST['my_captcha_challenge'] ] ){
    //do further processing, validate individual form fields
}

if( $captcha->validate( array_intersect_key($_POST, array_flip(['my_captcha', 'my_captcha_challenge']) ) ) ){
    //do further processing, validate individual form fields
}

主题/定制

MultiCaptcha附带一个默认主题,名为DefaultTheme。此主题支持通过themeOptions下的各种参数进行颜色/样式定制。例如,您可以更改背景颜色为蓝色

$captcha = new \MultiCaptcha\Captcha([
    'secret'=>    "form1-secret-key",
    'options' =>  [
        'image' => array(
            'maxCodeLength' => 8,
            'font'=>'../src/types/image/comic.ttf',
            'width'=>180,
            'themeOptions' => [
                'containerStyle' => 'border:1px solid #0f702d; border-radius: 5px; padding: 5px; display: table; margin: 2px; background-color: #29713f; font-family: Helvetica; font-size: 14px; max-width: 180px;position:relative;',
                'fieldStyle' => 'background-color:#52785e; border:2px solid #fff; color:#fff; font-size:120%; font-weight:bold; border-radius:3px;width:144px;',
                'labelStyle' => 'font-size:80%; line-height:100%; color: #fff;',
            ]
        ),
        'ascii' => array(
            'maxCodeLength' => 8,
            'fonts'=>array(
                'banner'=> 4,
                'doom'=> 8,
                'small'=>'8'
            ),
            'themeOptions' => [
                'containerStyle' => 'border:1px solid #1e2a37; border-radius: 5px; padding: 10px; display: table; margin: 2px; background-color: #374c63; font-family: Helvetica; font-size: 14px; max-width: 180px;position:relative;',
                'fieldStyle' => 'background-color:#4d5d6f; border:2px solid #fff; color:#fff; font-size:120%; font-weight:bold; border-radius:3px;width:144px;',
                'labelStyle' => 'font-size:80%; line-height:100%; color: #fff;'
            ]
        ),
    ],
    'refreshUrl'=>'random.php?captcha=refresh',
    'helpUrl'=>'http://github.com/sameer-shelavale/multi-captcha',

] );

注意:每种验证码类型都可以有自己的主题themeOptions

DefaultTheme的themeOptions

有了上述themeOptions,您将能够更改默认主题的外观和感觉。然而,如果您需要更改元素的位置,您必须通过扩展DefaultTheme来编写自己的主题。请参考example/theming.php以获取themeOptions的工作示例。

扩展DefaultTheme

  1. render()和refresh()函数对于渲染验证码至关重要,您的主题必须包含它。
  2. 当您扩展DefaultTheme时,您可以通过设置theme来使用该主题,例如。
$captcha = new \MultiCaptcha\Captcha([
    'secret'=>    "form1-secret-key",
    'options' =>  [
        'image' => array(
            'maxCodeLength' => 8,
            'font'=>'../src/types/image/comic.ttf',
            'width'=>180,
            'theme' => 'CustomTheme1'
        ),
        'ascii' => array(
            'maxCodeLength' => 8,
            'fonts'=>array(
                'banner'=> 4,
                'doom'=> 8,
                'small'=>'8'
            ),
            'theme' => 'CustomTheme2'
        ),
    ],
] );

注意:当您创建自己的主题时,您可以有自己的themeOptions。此外,请记住更新javascript刷新函数,每次您更改结构/布局时都需要更新。

缓存

MultiCaptcha使用文件缓存来记录回答的验证码,并使用它来通过单个验证码和多个答案来阻止暴力攻击。它在记录中存储验证码的唯一ID和过期时间,并且该记录保留到验证码过期。它使用文件缓存来存储这些记录。为了避免缓存变得太大,记录分散在多个文件中。用于缓存的文件数量由变量$cacheSize指定,应存储文件的位置由变量$cacheDir指定,您可以将这两个变量作为构造函数的参数传递。默认缓存大小为10,但对于繁忙的网站可以增加它。注意:如果您使用的是默认文件缓存实现,则缓存目录必须是可写的。

正在开发的功能

  1. 多语言支持

计划中的功能

  1. 为图片和gif验证码定制背景图像

许可

AGPL3.0,非商业用途免费。有关其他类型的许可,请联系我:[samiirds@gmail.com](mailto:samiirds@gmail.com)