Buyan-Captcha-v0.2.2-Beta介绍
开发前言
请直接参考这个链接我用了一个月的时间开发了个行为验证的组件这里不在重复啰嗦
⏲
效果预览
智能风控
快速部署,降低短信、登入接口等场景的自动化攻击风险,保护业务数据
结合IP画像、设备指纹、黑卡检测、威胁情报、行为数据等多维度信息实时识别风险
拥有自研大模型决策引擎、打码检测
识别到欺诈行为自动增强图像对抗、工作量对抗、行为对抗
以下提供了一个 拼图验证 的对抗的效果,行为识别到异常,验证越复杂
无感验证
用户点击登入、发送验证码等按钮,自动完成安全验证
滑块验证
通过滑动旋转图片与背景完成匹配,即可通过安全验证
拼图验证
用户只需拼接完整图片,即可完成安全验证
为了防止自动化通过比对内环外侧和外环内侧的像素色差来实现内外环咬合来进行破解
画布的内容将会随机偏移,这样子可以一定程度的防止通过相邻的像素来进行破解
所以如果出现这个情况是很正常的,用户只需要自己大概判断一下位置就好
以下是一个例子
验证流程
用户点击登入或者发送验证码,发送请求并显示行为验证码
用户按照提示要求完成验证
成功后再执行后续的回调
验证票据将随回调提交到您的后台,您的后台需要调用 Buyan-Captcha 做二次校验
返回校验通过或失败再到您的应用后端,再返回到前端
上面说过因为行为验证仍然会被破解,所以你应该还需要其他的方案配合验证
参考一下网上的的各式各样的爬虫破解,你会发现有很多相关的教程
哪怕是各位大厂也没有办法完全进行避免,所以你应该搭配其他的一些服务进行配合验证
因为我自己用的地方就只有评论组件等,所以我使用邮箱验证码来进行兜底
当然你也可以使用一些像什么手机短信,手机语音电话的方法进行兜底
比如登入中有其他验证:
拦截占比
在保证一定安全性的前提下,要确保正常用户都能够顺利通过验证码验证是不可能的
我都是拿自己来进行测试的
但也不能保证自己一次就通过(因为我调试的时候是使用我的二次元图片,所以图片非常花)
导致我自己也过不去
如果验证码的难度过高,导致正常用户的验证成功率过低
可能会影响用户体验,甚至可能导致用户流失
毕竟也不能设置的过于严格或简单
所以我通过误判率,误识率加上混淆矩阵来进行动态调整决策树在不同阈值下对正常和异常行为的处理
你可以观察阈值动态调整前后用户流失率的变化
如果使用该模块后发现用户流失率明显上升
可能意味着阈值调整影响了用户体验,导致部分用户放弃使用
你可以收集用户对行为验证过程的反馈意见
如问卷调查、在线反馈等方式获取用户的主观评价并将数据汇报给我
我会进行长期稳定性评估并且保证模型更新频率
后期维护
我会定期更新验证码的生成算法和验证逻辑,增加攻击者破解的难度
并且通过验证成功率来进行自适应调整验证的严格系数,如果大家通过率都高就设置严格点
当然了若系统检测到大量来自同一 IP 地址的异常验证请求,自动提高验证码的严格程度
其他问题
可靠性
当前为测试版本,暂不提供服务等级协议(SLA)保障
可能出现网络波动导致服务短暂延迟,建议进行测试使用后再确定是否使用
容灾处理
Buyan-Captcha自带自动重试机制,提升整体服务的可用性
目前只有这一个验证节点,所以目前没有实现资源&请求的主备切换
这代表着如果当Buyan-Captcha在服务器出现宕机时,无法进行验证,会导致业务方页面受影响
收费情况
服务目前免费,但因网络环境复杂,可能出现偶尔异常。如遇问题,欢迎联系反馈
服务承诺
我会致力于提供稳定、可靠的验证服务
同时保留根据使用情况调整规则的权利。以防止算法会被突破
您的理解与使用是我服务稳定运行的关键!
测试案例
部署接入
部署流程
1. 获取应用
1. 验证域名所有权
登录您的域名管理页面,增加一个 解析记录
配置:
- 类型为:TXT
- 主机名为:_buyancaptcha
- 主机记录:您的域名,如果没有设置多级域名的话,默认为该域名下都可以使用
- 解析值:JpCFa3iLFI7o7xCTfSb9UJlDAVobpkCLPvxwf3YuJMaM65m8
- 优先级:10
2. 验证生效
您可以通过以下命令验证是否生效
按下 Win + R 组合键,输入 cmd 并回车,或者在开始菜单中搜索 命令提示符 并打开
注意:请将您的域名替换到以下命令中
nslookup -type=TXT _buyancaptcha.主机记录
3. 获取 App Id
验证生效后,您的域名将自动添加到 Buyan-Captcha 白名单中
然后您可以通过以下接口(首次请求)获取您的 App Id
请求地址:
https://qaqbuyan.com:88/buyan_captcha?get_appid&host=?&user=?&email=?&picture=?
请求方式:GET
入参说明:
传参:
- host:您的域名
- user:您的昵称,支持中文
- email:您的邮箱
- picture:图库地址(可选)
- mode:验证模式,0表示点击旋转,1表示滑动旋转(默认0)
返回示例:
{
"code": 200, // 请求是否成功标识,200 为成功
"message": {
"host": "qaqbuyan.com", // 生效的域名
"appid": "59034b4a100c01ad", // 该应用的 App Id
"appkey": "KJ5ue8y3AKlDDBQa", // 该域名的 App Key, 用于刷新 App Id
"picture": "https://qaqbuyan.com:88/api/二次元/?type=pc", // 当前 应用 使用的图库地址
"mode": "click-rotate", // 当前 应用 使用的备用模式
"time": "2025-05-02 16:58:38" // 该应用的 App Id 生成时间
}
}
注意事项:
首次请求将获取到 App Id(用于获取 Token ) 以及 App Key(用于刷新 App Id ),再一次请求将无法获取
请妥善保管您的 App Key 代码。
如果您丢失了 App Key 应用令牌,这些代码是更新您 App Id 的最后手段。
如果您找不到这些代码,您将无法更新您的 App Id。
其他注意事项
关于 App Id 请查看注意事项中的 #应用令牌
关于 App Id 刷新请查看刷新应用,一般情况下不需要进行更新,永久生效
关于 picture 请查看注意事项中的 #图库地址
4. 获取 App Token
获取应用后,需要将 App Id 通过 刷新令牌 接口获取到 Token 并替换到以下代码中
关于 App Token 刷新请查看刷新令牌,一般情况下 24 小时后无效,需要使用 App Id 进行更新
常见问题
支持多级域名,如果设置为主域名,那么该域名下都可以使用,否则只能在该级域名下使用
TXT 解析一般在 10 分钟后生效。如果您无法直接设置您的域名,请联系您的域名提供商
如果您的域名已经设置了 TXT 解析,但是解析值不正确,您可以尝试删除该解析记录,然后重新添加解析记录
获取到 App Id 后可将该记录删除
2. 引入脚本
生成验证码的插件可通过以下方式引入:
<script src="https://qaqbuyan.com:88/buyan_captcha?js" type="text/javascript"></script>
注意:
避免下载到项目本地。我们后续更新策略的话该脚本可能会无法正常工作
Buyan-Captcha要求初始化在业务页面加载时同时进行初始化,否则验证无法获取用户在业务页面操作的行为数据,会导致验证策略失效,无法进行验证
3. 引入样式
正常情况下,会检测当前页面环境并自动植入样式表,当然开发者也可手动在页面植入样式表
如果组件没有自动植入,再手动在植入即可,默认情况下无需专门在页面中植入样式表,只需要引入脚本即可
<link rel="stylesheet" href="https://qaqbuyan.com:88/buyan_captcha?css" type="text/css" />
4. 调用方法
以下两个方法选择其中一种方法即可
JS API校验
buyanBehaviorCaptcha({
// 必选,请求验证信息的 Token
token: "e1ffkkpMtdke8DQe9KAorNZ7Z9rOi7ZZxOr4kh1L6I7TwWutE/S+qxs9bwZbaUwqaObIbg",
// 必选,点击触发,仅支持 #id 跟 .class
click: "#button",
// 必选,插入的 DOM,仅支持 #id 跟 .class
insertion: "#captcha-div",
// 必选,验证成功的回调
success: function(params, reset) {
// params 为返回的唯一通过码
// reset 为重置函数,用于重新拉起验证码
// 需要在接下来的实现逻辑回传服务器
// 将 params 传给业务后端(可通过 query参数 、header 等方式,可业务自定义)
// 业务后端使用该 params 提交到 验证接口 进行二次验证
// 不一定要在函数中进行数值传递,也可以通过闭包等其他方式进行传递
// 以下只是个简单的示例
// 比如点击 登入按钮 后可调用服务端接口,以下为伪代码,仅作示例用
// 登入 -> 二次验证 -> 登入(二次验证)失败 -> 重新拉起
if (login(params)) {
// 成功后,相关处理逻辑
console.log('登入成功');
} else {
// 失败后,相关处理逻辑
// 比如 登入接口密码错误,短信验证码错误等原因导致的业务失败
// 如果需要重新拉起验证码,进行验证
// 调用reset()方法重新显示验证码界面
console.log('登入失败');
if (reset && typeof reset === 'function') {
reset();
}
}
// 当然如果需要在回调中直接重置验证码
// 比如业务中通过其他组件,提示用户信息等,可以通过回调进行重新拉起
// 发送短信验证码 -> 二次验证 -> 发送(二次验证)失败 -> 重新拉起
// └──> 计时回调(如60 秒后才能重新发送短信验证码) -> 重新拉起
// 这样子的话可以避免用户恶意刷 短信验证码
// SMSSend(params, reset).then(function(result) {
// 失败直接进行重新拉起
// if (!result && typeof reset === "function") reset()
// 成功进行下一步处理
// if (result) {
// 成功后,相关处理逻辑
// console.log('发送成功');
// }
});
},
// 可选,令牌过期的回调
update: function () {
console.log('刷新令牌');
},
// 可选,失败的回调
fail: function () {
console.log('验证失败');
},
// 可选,点击刷新的回调
refresh: function() {
console.log('刷新验证');
}
});
Data API校验
Buyan-Captcha 支持通过自定义属性 buyan-captcha-config 自动初始化 UI 控件
在需要的元素上添加 buyan-captcha-config 属性,属性值为 JSON 格式的配置信息
Buyan-Captcha 会自动解析配置信息并初始化 UI 控件
在页面加载完成后自动生成验证按钮组件
以下为一个简单的示例:
<div buyan-captcha-config="{token:'e1ffkkpMtdke8DQe9KAorNZ7Z9rOi7ZZxOr4kh1L6I7TwWutE/S+qxs9bwZbaUwqaObIbg',click:'#showCaptchaButton',insertion:'#captcha-div',success:function(params){console.log('服务器返回的参数:',params);},update:function(){console.log('刷新令牌');},fail:function(){console.log('验证失败');},refresh:function(){console.log('刷新验证');}}"></div>
注意事项
隐私协议
再您使用该接口或组件时,视为默认同意隐私协议:Buyan-Captcha隐私协议
应用令牌
注意 App Id 生成后,再一次请求将获取不到 App Id 跟 App Key(生成的时候一定要记住 App Id 跟 App Key)
请妥善保管 App Key ,该 App Key 是用于 App Id 泄露或忘记时刷新 App Id的唯一方法
忘记 App Id 后可用 App Key 通过 刷新应用 ,进行更新
并且保证 App Key 不要被泄露,防止 App Id 被频繁刷新,导致服务失效
缓存问题
如果更新接口的时候返回 已更新,但是缓存并没有更新 ,那么只能等待缓存自动到期
图库地址
要求:
- 最小像素 800×800(px)
- 最小大小 500(kb)
- 最少数量 50(张)
- 静态图
- 定期更新
如果设置了图片的 URL 一定要为随机的 api 图片,不能为固定的图片
并且请定期更换验证码所使用的图片,避免攻击者通过分析固定图片来找到破解方法
保证图片是随机的,即在每次请求时都能获取到新的图片
图库中必须包含足够多的图片,以避免被爬虫识别,如使用爬虫来获取验证码图片来进行训练
需要让 Buyanbot 可以访问到,相关介绍: Buyanbot 爬虫介绍
可以进行链接跟踪,即跟踪重定向到图片
或只允许让 Buyanbot 可以访问到这个随机的 api 图片
觉得麻烦可以直接调用 AI 每一次生成不一样的图片
还有就是我上面说了我默认的图片是二次元图片,所以图片非常花
导致我自己也过不去,为了防止用户看不太清,导致无法正常进行验证
您不应该设置太花里胡哨的验证码图片,当然你可以在攻击频繁的时候设置
验证 Buyanbot 的方法
请求地址:
https://qaqbuyan.com:88/%E4%B9%94%E5%AE%89%E6%A8%A1%E5%9D%97/?mk=sj&id=bot
请求方式:POST
入参说明:
传参:
- buyanbot:请求的IP
传头:
- x-requested-with:XMLHttpRequest
返回示例:
{
"code": 200,// 请求是否成功标识,200 为成功
"message": "✔️171.107.74.169是通过验证的,在 2024-04-19 08:15:17 到 2024-04-27 07:52:18 的时间段内使用过"
}
接口文档
通过以下的 Buyan-Captcha API,接入的开发者可以实现一些功能,例如刷新 Token 二次验证等
刷新应用
用于刷新您的 App Id ,在忘记 App Id 或泄露 App Id 时进行刷新
注意:刷新后,之前的 App Id 将会失效
请求地址:
https://qaqbuyan.com:88/buyan_captcha?update_appid&appkey=?
请求方式:GET
传参:
- appkey:当前网站应用对应的 App Key
返回示例:
{
"code": 200, // 请求是否成功标识,200 为成功
"message": {
"host": "qaqbuyan.com", // 当前 App Key 对应的域名
"appid": "59034b4a100c01ad", // 当前更新的 App Id
"appkey": "fd75f18cd5504264", // 当前更新的 App Key
"picture": "https://qaqbuyan.com:88/api/二次元/?type=pc", // 当前 应用 使用的图库地址
"time": "2025-04-27 19:55:36" // 该应用的 App Id 第一次的生成时间
}
}
刷新令牌
用于您的网站后台定时通过 Buyan-Captcha 刷新,来获取验证所需要的 Token 及进行二次验证
组件有一个 update 函数用来进行获取新的 Token
您可以通过该函数编写一个请求来向您的后台获取最新的 Token ,而无需手动更新
您后台再请求该接口来得到返回的数据给前端
注意是后台请求,而不是前端进行请求,请避免 App Id 泄露
当然也可以将 Token 存储到 localStorage 中,这样可以响应更加迅速且不需要额外的请求
Token 有效期默认为 24 小时
请求地址:
https://qaqbuyan.com:88/buyan_captcha?update_token&appid=?
请求方式:GET
传参:
- appid:当前网站应用对应的 App Id
返回示例:
{
"code": 200, // 请求是否成功标识,200 为成功
"message": {
"token": "e1ffkkpMtdke8DQe9KAorNZ7Z9rOi7ZZxOr4kh1L6I7TwWutE/S+qxs9bwZbaUwqaObIbg", // 当前有效的 token
"picture": "https://qaqbuyan.com:88/api/二次元/?type=pc", // 当前 应用 使用的图库地址
"mode": "click-rotate", // 当前 应用 使用的验证模式
"expire": "1744039836" // 到期时间
}
}
更换图库
用于您的网站后台通过 Buyan-Captcha 刷新验证码图片
注意是后台请求,而不是前端进行请求,请避免 App Id 泄露
并且保证图片符合注意事项中的 注意事项 #图库地址 规则
请求地址:
https://qaqbuyan.com:88/buyan_captcha?update_picture&appid=?&picture=?
请求方式:GET
传参:
- appid:当前应用对应的 App Id
- picture:需要更新的图库地址
返回示例:
{
"code": 200,
"message": {
"host": "qaqbuyan.com", // 当前 App id 对应的域名
"past_picture": "https://bing.img.run/rand.php", // 之前使用的图库
"new_picture": "https://qaqbuyan.com:88/api/二次元/?type=pc", // 更新后的图库
"time": "2025-04-27 19:55:36" // 该应用的 App Id 第一次的生成时间
}
}
更换模式
用于您的网站后台通过 Buyan-Captcha 刷新验证码图片
注意是后台请求,而不是前端进行请求,请避免 App Id 泄露
请求地址:
https://qaqbuyan.com:88/buyan_captcha?update_mode&appid=?&mode=?
请求方式:GET
传参:
- appid:当前应用对应的 App Id
- mode:新的验证模式(0表示点击旋转,1表示滑动旋转)
返回示例:
{
"code": 200,
"message": {
"host": "qaqbuyan.com", // 当前 App id 对应的域名
"past_mode": "slider-rotate", // 之前使用的模式
"new_mode": "click-rotate", // 更新后的模式
"time": "2025-04-27 19:55:36" // 该应用的 App Id 第一次的生成时间
}
}
二次验证
前端验证完成后,会返回 票据 ,通过该 票据 进行二次验证
您的网站后台调用 Buyan-Captcha 的验证服务器接口获取验证结果
验证结果最长保留 5 分钟,在您的网站后台成功获取结果后,该 票据 会立即删除
请求地址:
https://qaqbuyan.com:88/buyan_captcha?verifyid=?&token=?
请求方式:GET
入参说明:
- verifyid:前端验证时返回的票据,由前端验证后返回
- token:当前有效的 token
返回示例:
{
"code": 200, // 请求是否成功标识,200 为成功
"message": true // 验证结果,true 为验证通过,false 为验证失败
}
请求统计
统计全部的调用以及验证次数
请求地址:
https://qaqbuyan.com:88/buyan_captcha?count?appid=?
请求方式:GET
入参说明:
- appid:当前网站应用对应的 App Id
返回示例:
{
"code": 200, // 请求是否成功标识,200 为成功
"message": {
"request": { // 请求统计
"total": 6351, // 全部请求统计
"yesterday": 115, // 昨天请求次数
"day": 7, // 最近24小时请求次数
"week": 455, // 最近7天请求次数
"month": 557, // 最近30天请求次数
"rotate": { // 旋转请求统计
"click_rotate": { // 点击旋转请求统计
"total": 2237,
"yesterday": 115,
"day": 7,
"week": 433,
"month": 535
},
"slider_rotate": { // 滑块旋转请求统计
"total": 4114,
"yesterday": 0,
"day": 0,
"week": 22,
"month": 22
}
}
},
"verify": { // 验证统计
"total": {
"success": 544,
"fail": 2352
},
"click_insensitive": { // 点击不敏感验证统计
"total": {
"success": 270, // 成功次数
"fail": 354 // 失败次数
},
"yesterday": {
"success": 38,
"fail": 6
},
"day": {
"success": 3,
"fail": 0
},
"week": {
"success": 142,
"fail": 52
},
"month": {
"success": 162,
"fail": 64
}
},
"click_rotate": { // 点击旋转验证统计
"total": {
"success": 184,
"fail": 300
},
"yesterday": {
"success": 0,
"fail": 0
},
"day": {
"success": 0,
"fail": 0
},
"week": {
"success": 38,
"fail": 72
},
"month": {
"success": 56,
"fail": 92
}
},
"slide_rotate": { // 滑块旋转验证统计
"total": {
"success": 90,
"fail": 1698
},
"yesterday": {
"success": 0,
"fail": 0
},
"day": {
"success": 0,
"fail": 0
},
"week": {
"success": 0,
"fail": 8
},
"month": {
"success": 0,
"fail": 8
}
}
}
}
}