我正在使用以下代码(通过“Dark Side of the Carton”)验证reCAPTCHA字段,之前提交包含验证码字段的表单的其余部分。
验证工作正常,调用'recaptchavalidate'页面,正确返回 True 或 False 并且JavaScript选择了这一切(我通过测试)警报(HTML); )
但是,当 True 时,表单不会像您期望的那样继续进行汇总。实际上,更糟糕的是,reCAPTCHA会更新,就像响应错误一样。
我认为这是我的JavaScript错误而不是reCAPTCHA ......但我哪里错了?
<script type="text/javascript">
$(function(){
function validateCaptcha()
{
challengeField = $("input#recaptcha_challenge_field").val();
responseField = $("input#recaptcha_response_field").val();
// alert(challengeField);
// alert(responseField);
//return false;
var html = $.ajax({
type: "POST",
url: "recaptchavalidate",
data: "recaptcha_challenge_field="+challengeField+ "&recaptcha_response_field="+responseField,
async: false
}).responseText;
if(html == "True")
{
$("#captchaStatus").html(" ");
alert(html);//test
return true;
}
else
{
$("#captchaStatus").html("Your captcha is incorrect. Please try again");
alert(html);//test
Recaptcha.reload();
return false;
}
}
$("#signup").submit(function(){
return validateCaptcha();
});
});
</script>
编辑:这仅用于在提交前检查没有错误。提交后通过Python(而不是JS)正确检查reCAPTCHA。因此,并不像一些用户所指出的那样安全漏洞。
答案 0 :(得分:1)
而不是警告“html”,硬编码“true”和“false”,这样你就可以确定它已经到达了正确的位置。
if(html == "True")
{
$("#captchaStatus").html(" ");
alert("true");//test
return true;
}
else
{
$("#captchaStatus").html("Your captcha is incorrect. Please try again");
alert("false");//test
Recaptcha.reload();
return false;
}
然后报告你的发现。
答案 1 :(得分:1)
似乎你对html == "True"
的测试没有通过。你确定这是你回来的确切字符串"True"
没有多余的字符/空格吗?例如,如果字符串的开头或结尾有空格,则传递将失败但如果您通过警告框显示文本,它仍然会显示为“True”。
尝试使用此检查来修改字符串末尾的空格:
if (html.replace(/^\s+|\s+$/, '') == "True")
答案 2 :(得分:0)
我迫不及待想在现实世界中遇到这种情况。 :)
然后我会破解你的javascript并将<{1}}替换为
validateCaptcha()
答案 3 :(得分:0)
也许你有
onclick="validateCaptcha();"
而不是
onclick="return validateCaptcha();"
以便始终调用父元素的(链接,按钮,表单)默认操作。
如果这一切都很好,那么我可以看到的唯一原因是表单提交发出错误的请求或服务器错误地处理了请求。使用HTTP监视器/分析器工具/插件检查在验证码验证的“真实”结果之后究竟调用了哪种请求。它至少听起来像是一个普通的GET请求,而不是对服务器的POST请求和/或服务器忽略了特定的请求,因为它无法识别URL模式和/或请求参数。