写点什么

KgCaptcha 验证的那些事

作者:宙哈哈
  • 2023-04-03
    广东
  • 本文字数:1560 字

    阅读完需:约 5 分钟

01 前言

针对 KgCaptcha 验证码,当用户点击完成验证,系统进行风险评估,根据风险程度进行验证,并返回结果。下面是我对前/后端验证的分析。


02 代码接入

HTML 代码


<script src="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><div id="captchaBox">载入中 ...</div>
复制代码


PHP 代码


<?phpinclude "public/KgCaptchaSDK.php";// 填写你的 AppId,在应用管理中获取$appId = "xxx";// 填写你的 AppSecret,在应用管理中获取$appSecret = "xxx";$request = new kgCaptcha($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 验证/验签分析

时间监测


  1. 页面载入离当前时间超过 20 分钟,有可能客户端时间不正确

  2. 第一次点击和最后一次点时时间过长,秒

  3. 第一次点击和最后一次点时时间过快,秒


if self.auth.data["level"] > 1 and self.POST["type"] not in (10, 11, 12, 13, 14, 15):  # 风控等级,字体识别和空间推理单次点击不检测间隔时间    inter = (5, 0.1) if self.POST["type"] in (1, 2) else (12, 0.2)  # 设置拼图/文字点击两种不同类型间隔时间    if abs(self.POST["load"] - self.kg["RUN_TIME"][3]) > self.timeout:  # 超时时间,JS载入时间离当时时间,秒        return self.r_code(code=30003)    if abs(self.POST["end"] - self.POST["start"]) > inter[0]:        return self.r_code(code=30004)    if abs(self.POST["end"] - self.POST["start"]) < inter[1]:        return self.r_code(code=30005)
复制代码


来路域名检测


if not self.kg["HTTP_REFERER"]: return self.r_code(30006)  # 域名不合法,无法获取来路域名if not self.auth.domain_auth(): return self.r_code(30007)  # 来源域名未授权
复制代码


验证次数限制检测


excess = self.auth.excess(1)    if excess:        return self.r_code(code=[30016, 30017, 30018][excess - 1])
复制代码


应用有效时间检测


 validity = self.auth.app_validity()    if validity[0] == 1: return self.r_code(30009)  # 授权未开始    if validity[0] == 2: return self.r_code(30010)  # 授权已结束
if self.auth.app_state(): return self.r_code(30011) # 当前应用/域名被禁用
复制代码


客户端 IP 地址


if not is_ip(self.kg["HTTP_ADDR"]): return self.r_code(30012)  # 无法获取IP地址    ip_list = self.auth.ip_list()    if ip_list == 1: return self.r_code(30013)  # 黑名单    if ip_list == 2: return self.r_code(30014)  # 非白名单
复制代码


用户在 X 分钟内错误记录数超过 n 条


if self.auth.data["level"] > 0:    if not self.auth.risk(): return self.r_code(30015)  # x 分钟内超过 n 条错误记录
复制代码

04 最后

SDK 开源地址:KgCaptcha (KgCaptcha) · GitHub,顺便做了一个演示:凯格行为验证码在线体验


用户头像

宙哈哈

关注

还未添加个人签名 2023-03-09 加入

还未添加个人简介

评论

发布
暂无评论
KgCaptcha验证的那些事_php_宙哈哈_InfoQ写作社区