elcodedocle / captchalot
Captcha 图像生成/验证 RESTful 网络服务
Requires
- php: >=5.3.0
- ext-gd: *
- ext-pdo: *
- elcodedocle/cryptosecureprng: 0.2.2
- elcodedocle/uuid: >=2.0.0
This package is not auto-updated.
Last update: 2024-09-28 22:31:25 UTC
README
基于字典/符号的 captcha 生成器和验证 RESTful 服务
版权(C)2014 Gael Abadin
许可证: MIT Expat
动机
我想在我的网络应用程序中实现一个简单、易于使用、可扩展且独立的 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.php,captchalot.js 和 index.php)。您可以通过在您的 Web 服务器上为这些文件提供公共执行/访问权限,然后在浏览器中指向 index.php 来进行测试。
这里是演示: https://synapp.info/tools/captchalot
服务缺陷
该 Web 应用程序是为了在需要 captcha 操作的几个负载很低的服务的简单嵌入而设计的。这意味着它没有考虑到效率或性能,尽管考虑到了可扩展性(如果您的服务器开始出现问题,可以将 captcha 服务移动到 AWS 或类似的服务,并开始向问题抛出按需实例;-)。
此外,它没有实现诸如为盲人或近视的人提供音频阅读器等无障碍功能(抱歉:-())。
致谢
一些匿名网民多年前发布了一篇博客文章(我无法找到),展示了如何使用 imagepng 创建图像、绘制线条并向其添加文本 Peter Norvig,他是 包含 300 万个最常用英语单词的汇编 的出版商,这些单词来自 自然语言语料库数据,其中 单词列表 是该项目默认字典来源的来源。
这就是现在所有的内容,朋友们。如果您喜欢这个项目,请随意为我买一杯啤酒;-)
比特币:1G4d1Ak4aRXqN8SFqiiiGMFSaffxFbu5EX
狗狗币:D8axrRWBZA686kEey1rCXXXamjGg9f6A6s
祝您玩得开心。-