如何通过javascript检测重新Captcha网站密钥是否有效?

时间:2015-11-10 00:08:32

标签: javascript recaptcha

我试图检测“无效的网站密钥”'谷歌通过javascript重新获得Captcha的错误,因此可以将错误报告给服务器以进一步处理。我使用显式渲染模式并调用api函数grecaptcha.render('iframeid', {'site-key':'xxx'});,尽管此函数不会返回任何错误响应或抛出异常,即使它加载以下内容:enter image description here

我无法读取加载的错误文本,因为它已加载到不同域的iframe中。无论如何通过javascript或服务器端自动检测无效的站点密钥?

修改 最终解决方案是加载带有phantomjs的测试页面并解析recaptcha的html

2 个答案:

答案 0 :(得分:1)

Google不提供验证网站密钥的方法,因为reCapthca位于iframe中,并且框架的代码在客户端无法以编程方式访问,因此您无法通过JS攻击/访问reCaptcha html代码。

  

在推送新网站时忘记更新信息中心中的允许域是一个常见的错误。

由于您管理多个域,我建议您为所使用的所有域使用一个站点密钥。请使用secure token

哈克

另一种选择可能是你开发了一个脚本,它将访问感兴趣的网站,截取/捕捉加载的reCaptcha,应用OCR(例如使用this)并返回结果,如果网站密钥是否有效。

答案 1 :(得分:0)

由于 Google 没有提供官方方法来检查这一点,我刚刚实施了一种解决方法,在 Google 的 Recaptcha URL 上执行 GET 请求。我已经使用 PHP 进行了制作,但是为 JavaScript 调整解决方案并不难,尽管它可能会因 Same Origin Policy 而导致跨域错误。因此,如果有人使用 JavaScript 测试此解决方案,请告诉我们它的运行情况(如果它不起作用,始终可以在您自己的服务器上运行 AJAX 并直接从您的服务器检查有效性)。

除此之外,就我而言,我使用的是 Invisible ReCaptcha v2,但我认为这种方法也可用于其他 Recaptcha。

  1. 首先,您应该挂载您的 URL。我找不到确定这个“co”参数的方法,我不知道这意味着什么。但看起来不同的网站都接受了不同的值。您可以通过在页面上添加 Recaptcha 代码(无论它是否具有有效密钥)然后检查生成的 src 上的 <iframe> 参数来查找此值。
        $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 也是如此)。

  1. 然后,您对该 URL 执行 GET 请求。在 PHP 上,您可以使用 cURL。如果是 Wordpress,则可以使用 wp_remote_get。在 JavaScript(实际上是 jQuery)上,您可以使用 $.get
    $.get( recaptcha_url, function(data, status){ ... });
  1. 最后,您检查响应正文是否包含字符串 'Recaptcha.anchor.ErrorMain.init'。这意味着当 Recaptcha 站点密钥对当前域无效时,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 上,我认为您可以检查 data 上收到的 $.get 变量。

不幸的是,这不是一个强有力的解决方案。 Google 可以更改请求和响应,这可能会破坏实现。但是我们无能为力,因为没有官方电话来检查密钥。