博客列表 >KgCaptcha验证的那些事

KgCaptcha验证的那些事

原创
2023年04月03日 14:12:20303浏览

01 前言

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

02 代码接入

HTML代码

  1. <script src="captcha.js?appid=xxx"></script>
  2. <script>
  3. kg.captcha({
  4. // 绑定元素,验证框显示区域
  5. bind: "#captchaBox",
  6. // 验证成功事务处理
  7. success: function(e) {
  8. console.log(e);
  9. },
  10. // 验证失败事务处理
  11. failure: function(e) {
  12. console.log(e);
  13. },
  14. // 点击刷新按钮时触发
  15. refresh: function(e) {
  16. console.log(e);
  17. }
  18. });
  19. </script>
  20. <div id="captchaBox">载入中 ...</div>

PHP代码

  1. <?php
  2. include "public/KgCaptchaSDK.php";
  3. // 填写你的 AppId,在应用管理中获取
  4. $appId = "xxx";
  5. // 填写你的 AppSecret,在应用管理中获取
  6. $appSecret = "xxx";
  7. $request = new kgCaptcha($appId, $appSecret);
  8. // 填写应用服务域名,在应用管理中获取
  9. $request->appCdn = "https://cdn.kgcaptcha.com";
  10. // 前端验证成功后颁发的 token,有效期为两分钟
  11. $request->token = $_POST["kgCaptchaToken"];
  12. // 当安全策略中的防控等级为3时必须填写
  13. $request->userId = "kgCaptchaDemo";
  14. // 请求超时时间,秒
  15. $request->connectTimeout = 10;
  16. $requestResult = $request->sendRequest();
  17. if ($requestResult->code === 0) {
  18. // 验签成功逻辑处理
  19. echo "验证通过";
  20. } else {
  21. // 验签失败逻辑处理
  22. echo "验证失败,错误代码:{$requestResult->code}, 错误信息:{$requestResult->msg}";
  23. }

03 验证/验签分析

时间监测

  1. 页面载入离当前时间超过20分钟,有可能客户端时间不正确
  2. 第一次点击和最后一次点时时间过长,秒
  3. 第一次点击和最后一次点时时间过快,秒
  1. if self.auth.data["level"] > 1 and self.POST["type"] not in (10, 11, 12, 13, 14, 15): # 等级,字体识别和空间推理单次点击不检测间隔时间
  2. inter = (5, 0.1) if self.POST["type"] in (1, 2) else (12, 0.2) # 设置拼图/文字点击两种不同类型间隔时间
  3. if abs(self.POST["load"] - self.kg["RUN_TIME"][3]) > self.timeout: # 超时时间,JS载入时间离当时时间,秒
  4. return self.r_code(code=30003)
  5. if abs(self.POST["end"] - self.POST["start"]) > inter[0]:
  6. return self.r_code(code=30004)
  7. if abs(self.POST["end"] - self.POST["start"]) < inter[1]:
  8. return self.r_code(code=30005)

来路域名检测

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

验证次数限制检测

  1. excess = self.auth.excess(1)
  2. if excess:
  3. return self.r_code(code=[30016, 30017, 30018][excess - 1])

应用有效时间检测

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

客户端IP地址

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

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

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

04 最后

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

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议