当前位置: 首页 > news >正文

Google reCAPTCHA实现

Google reCAPTCHA 的前端实现主要分为 reCAPTCHA v2(复选框/图像验证)和 v3(无感验证)两种模式。以下是具体实现步骤和代码示例,结合关键注意事项:


🔧 一、reCAPTCHA v2 实现(复选框/图像验证)

1. 引入 reCAPTCHA API 脚本

在 HTML 的 <head> 中添加官方脚本:

<script src="https://www.google.com/recaptcha/api.js" async defer></script>
2. 在表单中嵌入验证组件
  • 复选框模式(用户点击“我不是机器人”):
    <form><div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div><button type="submit">提交</button>
    </form>
    
  • 图像挑战模式(需用户识别图像):
    同上,但 data-sitekey 需替换为你的公钥(从 Google reCAPTCHA 控制台获取)。
3. 验证用户响应(前端交互)
  • 使用 grecaptcha.getResponse() 获取验证结果:
    function handleSubmit() {const response = grecaptcha.getResponse();if (!response) {alert("请完成人机验证!");return false;}// 发送 response 到后端验证
    }
    
  • 启用提交按钮的交互优化(可选):
    通过 data-callback 在验证通过后激活按钮:
    <div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY" data-callback="enableBtn"></div>
    <button id="submitBtn" disabled>提交</button>
    <script>function enableBtn() {document.getElementById("submitBtn").disabled = false;}
    </script>
    

🤖 二、reCAPTCHA v3 实现(无感验证)

1. 引入 API 脚本(指定公钥)
<script src="https://www.google.com/recaptcha/enterprise.js?render=YOUR_SITE_KEY"></script>
2. 在关键操作前获取令牌
grecaptcha.enterprise.ready(() => {grecaptcha.enterprise.execute('YOUR_SITE_KEY', { action: 'login' }).then(token => {// 将 token 附加到表单或 Ajax 请求const form = document.getElementById("loginForm");form.innerHTML += `<input type="hidden" name="recaptchaToken" value="${token}">`;form.submit();});
});
  • action 参数用于标识操作类型(如 loginsubmit),后端可据此分析风险。

⚠️ 三、关键注意事项

  1. 后端验证必须实现
    前端获取的 responsetoken 需发送到后端,通过 Google API 验证有效性(防止伪造):

    # Python 示例(后端)
    import requests
    secret_key = "YOUR_SECRET_KEY"
    response = requests.post("https://www.recaptcha.net/recaptcha/api/siteverify",data={"secret": secret_key, "response": user_token}
    ).json()
    if not response["success"]:return "验证失败"
    
  2. 国内网络环境特殊处理
    若用户在国内,需通过反向代理访问 reCAPTCHA:

    • Nginx 代理配置示例
      location /recaptcha {proxy_pass https://www.recaptcha.net;proxy_set_header Host $host;
      }
      
    • 前端替换 API 地址为代理路径:
      <script src="/recaptcha/api.js"></script>
      
  3. 版本选择建议

    场景推荐版本特点
    登录/注册表单v2 复选框用户感知明显,安全性高
    高频操作(如评论)v3无干扰,通过评分(0.0~1.0)判定风险
    支付/敏感操作v2 图像挑战高安全性,但用户体验较差

🚫 四、常见问题解决

  • 验证码不显示:检查公钥是否正确、网络是否可访问 www.google.com(国内需代理)。
  • 错误 “Invalid site key”:确认控制台中密钥与域名匹配。
  • v3 评分低:调整 action 粒度,或结合 v2 挑战高风险用户。

🔐 五、隐私与替代方案

  • 隐私争议:reCAPTCHA 被指控收集用户行为数据(鼠标轨迹、设备指纹)用于广告追踪,需评估合规性。
  • 国内替代方案
    若需规避网络或隐私问题,可考虑:
    • 腾讯验证码(腾讯云 Captcha)
    • 阿里云验证码。

💎 总结:前端实现仅完成 50%,后端验证才是安全的核心。建议 v3 用于高频低敏操作,v2 用于关键流程,国内用户务必配置代理或改用本地服务。

相关文章:

  • milvus 总结
  • Electron-vite【实战】MD 编辑器 -- 编辑区(含工具条、自定义右键快捷菜单、快捷键编辑、拖拽打开文件等)
  • 微服务架构中的 Kafka:异步通信与服务解耦(二)
  • 0611的
  • Intel Boot Guard
  • RAG的5种高效切分策略:提升检索增强生成效果的关键
  • Linux进程管理:创建,终止,等待
  • Linux611 libvirtb ;FTP vsftpd.conf部分配置文件
  • C#简单线程启动的几种方法总结
  • npm包 本地测试流程
  • 为 Nginx 配置 HTTPS(以 n8n 为例)完整教程【CentOS 7】
  • 时序数据库IoTDB数据模型建模实例详解
  • Java使用Selenium反爬虫优化方案
  • Nuxt3 中使用 pnpm 安装的 NuxtImg 使用会提示找不到图片
  • Linux(Centos 7.6)命令详解:whoami
  • 时序数据库Influxdb3 core安装
  • 【指针】(适合考研、专升本)
  • 基础篇:5. HTTP/2 协议深度解析
  • 递归,回溯,DFS,Floodfill,记忆化搜索
  • 【编译工具】(自动化)AI 赋能的自动化测试工具:如何让测试效率提升 500% 并实现智能质检?