Blogger Information
Blog 16
fans 0
comment 0
visits 5669
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
KgCaptcha验证的那些事
Original
299 people have browsed it

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,顺便做了一个演示:凯格行为验证码在线体验

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post