如何在ASP Classic中服务端验证Google Recaptcha 2.0?
解决ASP(VBScript)中Google reCAPTCHA 2.0验证始终返回False的问题
我猜你在ASP里折腾reCAPTCHA验证时,肯定踩了不少坑——毕竟VBScript处理这类API请求确实有几个容易忽略的点。下面我把正确的实现步骤和常见问题梳理清楚,帮你搞定这个验证功能。
先排查几个最容易出错的点
- Secret Key搞混了:别把前端用的Site Key当成后端的Secret Key,Secret Key是在Google reCAPTCHA控制台里专门给后端验证用的,一定要对应你注册的域名。
- 前端没正确传递响应值:表单提交时,必须确保
g-recaptcha-response字段被正确提交到后端,这个是reCAPTCHA生成的验证令牌。 - 请求Google API的方式不对:必须用POST方法,参数格式要符合
application/x-www-form-urlencoded,而且要带上用户的IP地址(虽然不是强制,但能提升验证准确性)。 - JSON解析出错:ASP原生没有JSON解析器,直接拿响应文本判断很容易出错,得用靠谱的方式解析
success字段。
完整的可运行代码示例
下面是整合了前端渲染和后端验证的完整代码,你可以直接替换自己的Key后测试:
<%@LANGUAGE=VBSCRIPT%> <% Option Explicit %> <html> <head> <script src="https://www.google.com/recaptcha/api.js" async defer></script> </head> <body> <% If Request.ServerVariables("REQUEST_METHOD") <> "POST" Then %> <!-- 前端表单页面 --> <form method="POST" action=""> <!-- 示例表单字段,换成你自己的 --> <label>用户名:</label> <input type="text" name="username" required><br><br> <!-- reCAPTCHA组件,替换成你的Site Key --> <div class="g-recaptcha" data-sitekey="你的Site Key"></div><br><br> <button type="submit">提交表单</button> </form> <% Else %> <!-- 后端验证逻辑 --> <% Dim recaptcha_secret, recaptcha_response, api_url, postData, objXML, responseText Dim is_valid, sc, jsonObj ' 1. 设置你的Secret Key(从Google控制台获取) recaptcha_secret = "你的Secret Key" ' 2. 获取前端提交的reCAPTCHA响应令牌 recaptcha_response = Trim(Request.Form("g-recaptcha-response")) ' 3. 检查响应令牌是否为空(用户没点reCAPTCHA就提交) If recaptcha_response = "" Then Response.Write "请完成reCAPTCHA验证后再提交!" Response.End End If ' 4. 构建请求Google验证API的POST参数 api_url = "https://www.google.com/recaptcha/api/siteverify" postData = "secret=" & Server.URLEncode(recaptcha_secret) & _ "&response=" & Server.URLEncode(recaptcha_response) & _ "&remoteip=" & Server.URLEncode(Request.ServerVariables("REMOTE_ADDR")) ' 5. 发送POST请求到Google验证API Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0") objXML.Open "POST", api_url, False objXML.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" objXML.Send postData ' 6. 获取响应文本并解析JSON responseText = objXML.ResponseText Set objXML = Nothing ' 用ScriptControl解析JSON(更严谨的方式) is_valid = False On Error Resume Next Set sc = Server.CreateObject("ScriptControl") sc.Language = "JScript" sc.AddCode("function parseJson(json){return eval('('+json+')');}") Set jsonObj = sc.Run("parseJson", responseText) If Err.Number = 0 Then is_valid = jsonObj.success Else ' 如果ScriptControl被禁用,退而求其次用字符串匹配 If InStr(responseText, """success"": true") > 0 Then is_valid = True End If End If On Error GoTo 0 Set sc = Nothing Set jsonObj = Nothing ' 7. 根据验证结果处理业务逻辑 If is_valid Then Response.Write "<h3>验证通过!</h3>" Response.Write "表单提交成功,用户名:" & Request.Form("username") ' 这里写你的后续处理逻辑(比如写入数据库) Else Response.Write "<h3>验证失败!</h3>" Response.Write "请完成reCAPTCHA验证后重试,或者刷新页面重新提交。" End If %> <% End If %> </body> </html>
额外的注意事项
- 本地测试:如果在localhost上测试,必须在Google reCAPTCHA控制台里把
localhost添加到允许的域名列表里,否则验证会直接失败。 - XMLHTTP版本:尽量使用
MSXML2.ServerXMLHTTP.6.0,旧版本可能有兼容性问题,如果服务器不支持,可以试试MSXML2.XMLHTTP。 - 错误处理:代码里加了
On Error Resume Next来处理ScriptControl禁用的情况,你可以根据自己的服务器环境调整解析方式。
内容的提问来源于stack exchange,提问作者megyptm
相关产品推荐
相关产品推荐

