如何不依赖Google或WordPress实现Google reCAPTCHA的纯PHP替代方案
纯PHP无依赖reCAPTCHA v3替代实现方案
核心特性
- 完全不依赖Google、WordPress等第三方服务,纯PHP后端实现
- 前端无交互感知,效果和reCAPTCHA v3完全一致,不需要用户手动输入验证码
- 支持风险分判定,可自定义拦截阈值
- 自带token防重放、过期校验逻辑
前端集成代码
和reCAPTCHA v3的调用逻辑类似,只需要在表单中插入隐藏字段,自动收集基础行为数据即可:
<form action="submit.php" method="post"> <!-- 其他表单字段 --> <input type="hidden" name="verify_token" id="verify_token" value=""> <input type="submit" value="提交"> </form> <script> // 页面加载时生成初始参数 window.pageLoadTime = Date.now(); window.mouseMoveCount = 0; window.hasFocus = false; // 监听基础行为数据 document.addEventListener('mousemove', () => window.mouseMoveCount++); window.addEventListener('focus', () => window.hasFocus = true); // 页面即将提交时生成验证参数 document.querySelector('form').addEventListener('submit', (e) => { const stayTime = Math.floor((Date.now() - window.pageLoadTime) / 1000); document.getElementById('verify_token').value = `${stayTime}|${window.mouseMoveCount}|${window.hasFocus ? 1 : 0}`; }); </script>
后端PHP实现逻辑
1. 表单页生成验证密钥(表单页顶部加入)
<?php session_start(); // 生成随机单次有效token,存到session防重放 $_SESSION['captcha_check'] = bin2hex(random_bytes(16)); $_SESSION['captcha_expire'] = time() + 3600; // 1小时有效期 ?>
2. 提交验证逻辑(submit.php实现)
<?php session_start(); function custom_captcha_verify(): bool { // 基础校验:session不存在直接拦截 if (empty($_SESSION['captcha_check']) || empty($_SESSION['captcha_expire']) || time() > $_SESSION['captcha_expire']) { unset($_SESSION['captcha_check'], $_SESSION['captcha_expire']); return false; } // 销毁单次token,防止重放 unset($_SESSION['captcha_check'], $_SESSION['captcha_expire']); // 解析前端上传的行为参数 if (empty($_POST['verify_token'])) return false; list($stay_time, $mouse_count, $has_focus) = array_map('intval', explode('|', $_POST['verify_token'])); // 风险判定规则,可根据自身场景调整阈值 $risk_score = 0; $risk_score += ($stay_time < 3) ? 50 : 0; // 页面停留不足3秒加50风险分 $risk_score += ($mouse_count < 5) ? 30 : 0; // 鼠标移动次数少于5次加30分 $risk_score += ($has_focus === 0) ? 20 : 0; // 页面从未获得焦点加20分 // 总分超过60判定为机器人 return $risk_score < 60; } // 调用示例 if (custom_captcha_verify()) { // 验证通过,处理表单提交逻辑 echo "提交成功"; } else { // 验证失败,拦截请求 echo "验证失败,请刷新页面重试"; } ?>
自定义优化建议
- 可根据自身业务场景调整风险规则和阈值,比如针对评论区可以调高拦截阈值,避免误拦截正常用户
- 可扩展更多行为特征:比如键盘输入速度、滚动条操作记录、是否有批量重复提交特征
- 高风险场景下可搭配低频次的点击验证作为降级方案,进一步提升拦截准确率
内容的提问来源于stack exchange,提问作者uk_user2014
相关产品推荐
相关产品推荐

