由于 Google 没有提供正式的检查方式,我刚刚实施了一种解决方法,在 Google 的 Recaptcha URL 上执行 GET 请求。我已经使用 PHP,但不难适应 JavaScript 的解决方案,尽管它可能因 Same Origin Policy 而以跨源错误结束。因此,如果有人使用 JavaScript 测试此解决方案,请告诉我们它是如何进行的(如果它不起作用,始终可以在您自己的服务器上运行 AJAX 并直接从您的服务器检查有效性)。
除此之外,就我而言,我使用的是 Invisible ReCaptcha v2,但我认为这种方法也可以用于其他 Recaptcha。
- 首先,您应该挂载您的 URL。我找不到确定这个“co”参数的方法,我不知道它是什么意思。但看起来不同的网站都接受了不同的值。您可以通过在您的页面上添加 Recaptcha 代码来查找此值(无论它是否具有有效的密钥),然后检查生成的
<iframe> 上的 src 参数。
$recaptcha_url = sprintf(
'https://www.google.com/recaptcha/api2/anchor?ar=1&k=%s&co=%s&hl=%s&size=%s',
RECAPTCHA_SITE_KEY,
'<co_param_value>',
'en-US',
'invisible'
);
在 JavaScript 上是这样的:
recaptcha_url = 'https://www.google.com/recaptcha/api2/anchor?ar=1&k=' + RECAPTCHA_SITE_KEY + ' &co=' + CO_VALUE + '&hl=en-US&size=invisible';
如果您没有使用 Invisible Recaptcha,size 参数必须不同。但是您也可以省略它,因为至少在我的测试中,不需要检查站点密钥是否有效(语言参数 hl 也是如此)。
- 然后,您对该 URL 执行 GET 请求。在 PHP 上,您可以使用cURL。如果是 Wordpress,可以使用
wp_remote_get。在 JavaScript(实际上是 jQuery)上,您可以使用 $.get。
$.get( recaptcha_url, function(data, status){ ... });
- 最后,检查响应正文是否包含字符串
'Recaptcha.anchor.ErrorMain.init'。这意味着当 Recaptcha Site Key 对当前域无效时,Google 会处理错误,并且此字符串会出现在响应正文中(实际上,此字符串会导致任何 ReCaptcha 错误,因此请记住这是一种解决方法)。李>
如果您使用的是 Wordpress,则可以使用 wp_remote_retrieve_body。像这样的:
$response = wp_remote_get( $recaptcha_url );
$response_body = wp_remote_retrieve_body( $response );
if( strpos( $response_body, 'recaptcha.anchor.ErrorMain.init' ) !== false ) {
// Site is not valid for current Recaptcha Keys
}
在 JavaScript 上,我认为您可以检查在 $.get 上收到的 data 变量。
很遗憾,这不是一个强有力的解决方案。 Google 可以同时更改请求和响应,这可能会破坏实现。但是我们对此无能为力,因为没有官方要求检查密钥。