通过用户验证获得g-recaptcha-response
后,我site verification。
我发送xhr POST参数并获得200 OK,但没有响应,因为它应该是:
{
"success": true|false,
"error-codes": [...] // optional
}
<script type='text/javascript'>
var onReturnCallback = function(response) {
document.getElementById('resp').innerHTML = response; // works well
//alert('grecaptcha.getResponse() = ' + grecaptcha.getResponse()); // works well too
$.post("https://www.google.com/recaptcha/api/siteverify",
{ secret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
response: response,
remoteip : "<?php echo $ip;?>" // optional, does not influence an empty result
}).complete(function( data ) {
alert( "Data returned from POST: " + data.toString() );
console.dir(data);
});
};
</script>
Form.
<form method="post">
<div class="g-recaptcha" data-sitekey="6LdYKQkTAAAAAD9K6-kHspFUPUnftw1RxP5_awi0" data-callback="onReturnCallback" data-theme="light"> </div>
<input name="send" type="submit" />
</form>
我在控制台中打印的对象是完全空的(statusText='error'
除外),请参阅shot。
控制台中还有其他错误:
XMLHttpRequest无法加载https://www.google.com/recaptcha/api/siteverify。 No&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。起源&#39; http://tarex.ru&#39;因此不允许访问。
如何处理?我可以更改原始标题吗?如何验证?
演示的link。
答案 0 :(得分:2)
由于所谓的“同源策略”(SOP)阻止XSS攻击,不可能向服务于网站的主机之外的主机发出XHR(“AJAX请求”)。
但是,您可以从php代理发布到reCaptcha站点,您可以在自己的主机上运行。给出了一个例子in this answer。这也可以防止您的秘密被公开给那些查看客户端源代码的人。
另一种可能性(取决于您要使用的服务)是JSONP。由于XHR是禁止的,但是从外部主机加载脚本不是,可以通过查询参数将回调函数的名称添加到脚本URL。一旦加载外部资源,就会调用此函数。但据我所知,reCaptcha不支持JSONP。
答案 1 :(得分:0)
reCaptcha据称支持jsonp作为dataType参数的合法值。