elcodedocle/captchalot

Captcha 图像生成/验证 RESTful 网络服务

1.2.0 2024-09-14 22:21 UTC

This package is not auto-updated.

Last update: 2024-09-28 22:31:25 UTC


README

基于字典/符号的 captcha 生成器和验证 RESTful 服务

版权(C)2014 Gael Abadin
许可证: MIT Expat

captchalot captcha generator test site snapshot with default settings

动机

我想在我的网络应用程序中实现一个简单、易于使用、可扩展且独立的 RESTful captcha 服务。

要求

  • PHP >= 5.3 且支持 PDO
  • MySQL / MariaDB,Postgres;或支持 PDO 的数据库

部署

  • 您可以使用 composer 安装和部署 captchalot
php composer.phar create-project -s "beta" elcodedocle/captchalot
  • 您需要编辑 config.php.dist 以提供基本的数据库连接参数;然后将其保存为 config.php

  • 以下是一个用 JavaScript 编写的客户端示例,用于 AJAX 请求/刷新/验证 captcha

var captchalot = {
    
    'validate' : function(opts){

        let XHR = new XMLHttpRequest(),
            responseJSON,
            parameters,
            options = (typeof (opts) === 'object')?opts:{
                uuid: '',
                magicword: '',
                width: 350,
                height: 50,
                callbackSuccess: function(responseJSON){ alert('success!'); console.log(responseJSON); },
                callbackError: function(responseJSON){ alert('error!'); console.log(responseJSON); }
            };
        
        XHR.addEventListener("load", function(event) {
            
            try {
                responseJSON = JSON.parse(event.target.responseText);
                if (
                    !('data' in responseJSON) ||
                    !('validationResult' in responseJSON.data) ||
                        responseJSON.data['validationResult'] !== 'ERROR'
                          && responseJSON.data['validationResult'] !== 'PENDING'
                            && responseJSON.data['validationResult'] !== 'OK'
                ){
                    console.log(
                        "Cannot understand response from server:\n"
                            + responseJSON
                    );
                    options.callbackError(responseJSON);
                } else {
                    if ( responseJSON.data['validationResult'] === 'OK' ){
                        options.callbackSuccess(responseJSON);
                    } else {
                        options.callbackError(responseJSON);
                    }
                }
            } catch (e) {
                console.error("Parsing error:", e);
                console.log(event.target.responseText);
            }
            
        });
        
        XHR.addEventListener("error", function(event) {
            alert('Something went wrong ¯\\(º_o)/¯');
            console.log(event.target.responseText);
        });
        
        XHR.open("POST", 'validate.php', true);
        XHR.setRequestHeader(
            'Content-type', 
            'application/x-www-form-urlencoded'
        );
        parameters = 'uuid=' 
            + options.uuid 
            + '&magicword=' 
            + encodeURIComponent(options.magicword)
            + '&width='+options.width
            + '&height='+options.height;
        XHR.send(parameters);
        
    }
    
};
  • 以下是此客户端的 PHP 服务器端控制器
<?php
require_once __DIR__ . '/vendor/autoload.php';
use info\synapp\tools\captcha\Session;
use info\synapp\tools\uuid\UUID;
use info\synapp\tools\captcha\CaptchaWord;
use info\synapp\tools\captcha\CaptchaImage;
use info\synapp\tools\captcha\Captcha;

session_start();
ob_start();
$VALIDATION_RESULT_PENDING = 'PENDING';
$VALIDATION_RESULT_OK = 'OK';
$VALIDATION_RESULT_ERROR = 'ERROR';

$session = new Session(session_id());
$session->removeExpiredCaptchas();
$uuidGenerator = new UUID();
$captchaWord = new CaptchaWord();


$options=array('options'=>array('default'=>420, 'min_range'=>70, 'max_range'=>4200));
$width=filter_input(INPUT_POST, 'width', FILTER_VALIDATE_INT, $options);
$options=array('options'=>array('default'=>60, 'min_range'=>10, 'max_range'=>600));
$height=filter_input(INPUT_POST, 'height', FILTER_VALIDATE_INT, $options);

$captchaImage = new CaptchaImage($width,$height);
$captcha = new Captcha($session,null,$uuidGenerator,$captchaWord,$captchaImage);

$output = array(
    'data' => array(
        'validationResult' => $VALIDATION_RESULT_PENDING,
    ),
);

if (
    isset($_REQUEST['uuid'])
    && $_REQUEST['uuid']!==''
    && isset($_REQUEST['magicword'])
    && $_REQUEST['magicword']!==''
){
    if($captcha->validate($_REQUEST['uuid'],$_REQUEST['magicword'])){
        $output['data']['validationResult'] = $VALIDATION_RESULT_OK;
    } else {
        $output['data']['validationResult'] = $VALIDATION_RESULT_ERROR;
    }
}

if($output['data']['validationResult']!==$VALIDATION_RESULT_OK){
    $output['data']=array_merge(
        $output['data'],
        $captcha->getCaptchaUuidAndImgBase64SrcAttrVal()
    );
}

header('Content-type: application/json');
header('Expires: Sun, 1 Jan 2000 12:00:00 GMT');
header('Last-Modified: '.gmdate("D, d M Y H:i:s").'GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');

$jsonOutput = json_encode($output);
echo $jsonOutput;

ob_end_flush();
  • 如果您想了解更多关于调整、支持的配置/输入参数和值的信息,请查看代码(或使用 phpdocumentor 生成文档)。

Web 应用程序

您可以在提供的 Web 应用程序中测试上面的代码(validate.phpcaptchalot.jsindex.php)。您可以通过在您的 Web 服务器上为这些文件提供公共执行/访问权限,然后在浏览器中指向 index.php 来进行测试。

这里是演示: https://synapp.info/tools/captchalot

服务缺陷

该 Web 应用程序是为了在需要 captcha 操作的几个负载很低的服务的简单嵌入而设计的。这意味着它没有考虑到效率或性能,尽管考虑到了可扩展性(如果您的服务器开始出现问题,可以将 captcha 服务移动到 AWS 或类似的服务,并开始向问题抛出按需实例;-)。

此外,它没有实现诸如为盲人或近视的人提供音频阅读器等无障碍功能(抱歉:-())。

致谢

一些匿名网民多年前发布了一篇博客文章(我无法找到),展示了如何使用 imagepng 创建图像、绘制线条并向其添加文本 Peter Norvig,他是 包含 300 万个最常用英语单词的汇编 的出版商,这些单词来自 自然语言语料库数据,其中 单词列表 是该项目默认字典来源的来源。

这就是现在所有的内容,朋友们。如果您喜欢这个项目,请随意为我买一杯啤酒;-)

比特币:1G4d1Ak4aRXqN8SFqiiiGMFSaffxFbu5EX

狗狗币:D8axrRWBZA686kEey1rCXXXamjGg9f6A6s

贝宝:http://goo.gl/Q2kRFG

祝您玩得开心。-