这个项目为什么出现?用云服务不好么?
起因是这样的.....
公司的网站经常被同行搞,ddos,cc,各种乱七八糟的方式搞,然后我们上了高防后发现使用暴力手段已经无法搞死,然后他们就开始通过技术手段开始找服务器漏洞,它们尝试了各种注入,好在我们有waf,注入不进去,然后它们就发现,可以通过刷短信直接让我们肉疼,一开始是我们没考虑刷短信问题,只是限制了IP+手机号一个小时只能发3条,没想到一天消耗了我们近万元短信费,它们的代理ip多到数不清,然后通过随机手机号+代理ip刷的飞起,限制了就换ip,我醒来发现天都塌了.......
然后我就想到了云服务的验证码,没想到只是短信刷的速度慢了一点,并且是真的贵,一次大概1分钱,再加上我们的短信3分钱,一次成本就4分钱,赶上短信3/1的价格了
然后我就在想,能不能自己开发一个验证码系统,做成我顺便公开出来,让大家一起帮我完善我的机器人检测数据库,顺便吧接入方式弄的简单一些,然后再免费(同行搞我们的原因就是我们太喜欢搞免费了haha)
你的验证码就可以防住机器人么?
目前云服务的验证码基本都是拼图,但是如果搞事情的人愿意搞你,其实可以通过yolo方式暴力找拼图的位置
虽然说云服务的拼图验证码还要一层轨迹识别,但是现在随便写个脚本就可以模拟出人速度不均匀的轨迹数据
所以说我想到一个骚操作(其实google亚马逊等国外大平台早就用了)就是ai对空间性和场景同时解读不太可以(除非那种大模型),为了搞你杀敌800自损1000来说比拼图那种杀敌1000自损100来说性价比已经很高了
比如下面这张图,人一看就知道那边是正,但是ai可能就不一定了,并且会根据可疑程度,加大难度(其实就是以前百度的活)
小玩一下?
如何对接?
HTML 部分
你没看错,html部分就这么简单,甚至不需要 <script src="xxxx ......<div class="__Fox__captcha__"></div>
JavaScript 部分
需要调用验证码的时候直接执行下面这一坨就可以,记得先创建一个塞验证码的容器再执行,可以吧下面这一坨打包成一个函数极致简化对接流程,前端只需要一小坨代码,甚至不需要引入js(其实是代码引入啦)
// 后面的[__Fox__captcha__] 替换成你要显示验证码的容器 使劲横向向右拉→ ↓这里
document.head.appendChild(Object.assign(document.createElement("script"),{src:"//api.jihujiasuqi.com/apps/captcha/index/captcha.js?"+Date.now(),onload:()=>document.querySelector('.__Fox__captcha__').captcha({
title: '安全验证', // 这里是标题
desc: '拖动滑块,使图片角度为正',// 这里是提示文字
init: (state) => {
// 这里是验证码初始化完成的回调,验证码加载完成后将执行这个
console.log('验证码初始化成功',state)
},
success: () => {
// 验证成功后自行处理,验证完成后 complete 会返回一个id,发到服务器后端验证验证码是否正确
console.log('验证成功');
},
fail: () => {
// 验证失败自行处理,可以重新获取验证码或者关闭页面什么的,看你的项目需求
console.log('验证失败');
},
complete: (state) => {
// state 是验证完成后返回的id,发到服务器后端验证验证码是否正确,无论正确还是错误,都会有这个回调
console.log('验证回调数据:', state)
// 我这里是演示,所以说我直接刷新了,实际项目按照需求修改,别跟我一样直接刷新haha ,返回的是一个数组,里面有okey和rand,这个要传到服务器上(你的后端)来进行识别验证码是否正确
setTimeout(() => {
alert("回调数据:\n\nokey:"+state.okey+"\nrand:"+state.rand);
location.reload()
}, 500);
}
})}));
后端
后端只需要传参okey和rand即可,如果你不知道在哪里,可以运行下demo,看一眼就知道是那个了GET
https://api.jihujiasuqi.com/apps/captcha/server_verify.php?rand=<前端的rand>&okey=<前端的okey>响应结果
返回json字符串{
"state": "ok",
"score": 114, // [正在开发中] 验证得分(可信度),区间[0, 100]
"success": 0 // 验证结果,1为通过,0为失败,2为超时(3分钟)
}