01 前言
针对KgCaptcha验证码,当用户点击完成验证,系统进行风险评估,根据风险程度进行验证,并返回结果。下面是我对前/后端验证的分析。
02 代码接入
HTML代码
<scriptsrc="captcha.js?appid=xxx"></script><script>kg.captcha({ // 绑定元素,验证框显示区域bind: "#captchaBox", // 验证成功事务处理success: function(e) { console.log(e); }, // 验证失败事务处理failure: function(e) { console.log(e); }, // 点击刷新按钮时触发refresh: function(e) { console.log(e); } }); </script><divid="captchaBox">载入中 ...</div>
PHP代码
include"public/KgCaptchaSDK.php"; // 填写你的 AppId,在应用管理中获取$appId="xxx"; // 填写你的 AppSecret,在应用管理中获取$appSecret="xxx"; $request=newkgCaptcha($appId, $appSecret); // 填写应用服务域名,在应用管理中获取$request->appCdn="https://cdn.kgcaptcha.com"; // 前端验证成功后颁发的 token,有效期为两分钟$request->token=$_POST["kgCaptchaToken"]; // 当安全策略中的防控等级为3时必须填写$request->userId="kgCaptchaDemo"; // 请求超时时间,秒$request->connectTimeout=10; $requestResult=$request->sendRequest(); if ($requestResult->code===0) { // 验签成功逻辑处理echo"验证通过"; } else { // 验签失败逻辑处理echo"验证失败,错误代码:{$requestResult->code}, 错误信息:{$requestResult->msg}"; }
03 验证/验签分析
时间监测
- 页面载入离当前时间超过20分钟,有可能客户端时间不正确
- 第一次点击和最后一次点时时间过长,秒
- 第一次点击和最后一次点时时间过快,秒
ifself.auth.data["level"] >1andself.POST["type"] notin (10, 11, 12, 13, 14, 15): # 风控等级,字体识别和空间推理单次点击不检测间隔时间inter= (5, 0.1) ifself.POST["type"] in (1, 2) else (12, 0.2) # 设置拼图/文字点击两种不同类型间隔时间ifabs(self.POST["load"] -self.kg["RUN_TIME"][3]) >self.timeout: # 超时时间,JS载入时间离当时时间,秒returnself.r_code(code=30003) ifabs(self.POST["end"] -self.POST["start"]) >inter[0]: returnself.r_code(code=30004) ifabs(self.POST["end"] -self.POST["start"]) <inter[1]: returnself.r_code(code=30005)
来路域名检测
ifnotself.kg["HTTP_REFERER"]: returnself.r_code(30006) # 域名不合法,无法获取来路域名ifnotself.auth.domain_auth(): returnself.r_code(30007) # 来源域名未授权
验证次数限制检测
excess=self.auth.excess(1) ifexcess: returnself.r_code(code=[30016, 30017, 30018][excess-1])
应用有效时间检测
validity=self.auth.app_validity() ifvalidity[0] ==1: returnself.r_code(30009) # 授权未开始ifvalidity[0] ==2: returnself.r_code(30010) # 授权已结束ifself.auth.app_state(): returnself.r_code(30011) # 当前应用/域名被禁用
客户端IP地址
ifnotis_ip(self.kg["HTTP_ADDR"]): returnself.r_code(30012) # 无法获取IP地址ip_list=self.auth.ip_list() ifip_list==1: returnself.r_code(30013) # 黑名单ifip_list==2: returnself.r_code(30014) # 非白名单
用户在X分钟内错误记录数超过n条
ifself.auth.data["level"] >0: ifnotself.auth.risk(): returnself.r_code(30015) # x 分钟内超过 n 条错误记录
04 最后
SDK开源地址:KgCaptcha (KgCaptcha) · GitHub,顺便做了一个演示:凯格行为验证码在线体验