宙哈哈 发表于 2023-4-10 11:25:19

[验证码] KgCaptcha风险监测方法

前言
“访问过于频繁,请先完成验证”,相信大家对这句话应该不陌生。当我们访问一个网站过于频繁时,就会弹出这样的提示,甚至于让我们先通过滑动验证码。

开发过程
1、模拟当前为新闻列表。

2、前台接入KgCaptcha
<script src="captcha.js?appid=xxx"></script>

<script type="text/javascript">

kg.captcha({

    // 绑定弹窗按钮

    button: "#captchaButton",

    // 验证成功事务处理

    success: function (e) {

      // 验证成功,直接提交表单

      console.log(e);

      document.cookie = "sNum=1";

      document.cookie = "sTime="+Math.round(new Date().getTime()/1000);

      document.getElementById('kgCaptchaToken').value = e['token']

      form1.submit();

    },

    // 验证失败事务处理

    failure: function (e) {

      console.log(e);

    },

    // 点击刷新按钮时触发

    refresh: function (e) {

      console.log(e);

    }



</script>



<a id="captchaButton" style="display: none;">点击弹出验证窗口</a>

<form method="post" id="form1" name="form1">

    <input type="hidden" name="action" value="captcha" />

    <input type="hidden" name="kgCaptchaToken" id="kgCaptchaToken" value="" />


</form>




3、要求通过cookie监测当前页面访问,指定时间内访问次数超出,则弹出验证码,要求用户验证。

若为首次访问,弹出验证码,要求用户验证。

// 设置cookie

window.onload = function() {

    // 当前时间

    var cTime = Math.round(new Date().getTime()/1000)

    // 当前cookie的访问次数

    var sNum = get_cookie2('sNum')

    // 当前cookie的上一次访问时间

    var sTime = get_cookie2('sTime')

    // 判断cookie是否设置

    if (sNum==undefined && sTime==undefined) {

      document.getElementById('captchaButton').click()

    } else {

       // 判断访问次数和上一次访问时间

      if (parseInt(sTime)+10 <= cTime && sNum>9) {

            document.getElementById('captchaButton').click()

      } else {

            if (cTime - sTime < 10) {

                document.cookie = "sNum="+(parseInt(sNum)+1);

                document.cookie = "sTime="+sTime;

            } else {

                document.cookie = "sNum=1";

                document.cookie = "sTime="+cTime;

            }

      }

    }

}



// 获取cookie的方法

function get_cookie2(val) {

    var arr = document.cookie.split(';');

    for(var i = 0; i < arr.length; i++){

      var arr2 = arr.split('=');

      arr2 = arr2.replace(/\s*/g,"");

      if(arr2 == val){

            return arr2

      }

    }


}4、后端验证<?php

header("Content-type:text/html;charset=utf-8");

// 后端验证

if (isset($_POST) && $_POST['action'] == 'captcha') {

    include "./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 "<script>alert('验证通过');</script>";

      header('location: demo.php');

    } else {

      // 验签失败逻辑处理

      echo "<script>alert('验证失败,错误代码:{$requestResult->code}, 错误信息:{$requestResult->msg}');</script>";

      header('location: demo.php');

    }

}


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


页: [1]
查看完整版本: [验证码] KgCaptcha风险监测方法