收藏本站 Archiver
    请 后使用快捷导航
    没有账号?入住 CI 中国社区
    查看: 3092|回复: 0

    [Web] KgCaptcha验证的那些事

    [复制链接]
    楼主
    发表于 2023年4月11日 11:15:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |
    本帖最后由 宙哈哈 于 2023年4月11日 11:15 编辑

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

    2.PNG (246.39 KB, 下载次数: 63)

    下载附件

    2023年4月11日 11:10 上传



    代码接入
    HTML代码
    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代码
    PHP复制代码
    <?php
    include "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}";
    }
    复制代码

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


    来路域名检测
    1. if not self.kg[&quot;HTTP_REFERER&quot;]: 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[&quot;HTTP_ADDR&quot;]): 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[&quot;level&quot;] &gt; 0:
    2. if not self.auth.risk(): return self.r_code(30015) # x 分钟内超过 n 条错误记录
    复制代码

    结尾
    SDK开源地址:https://github.com/KgCaptcha,顺便做了一个演示:https://www.kgcaptcha.com/demo/


    返回列表
    您需要登录后才可以回帖 登录 | 入住 CI 中国社区

    本版积分规则

    AltStyle によって変換されたページ (->オリジナル) /