【问题标题】:How to detect if a re-Captcha site key is valid via javascript?如何通过javascript检测重新验证码站点密钥是否有效?
【发布时间】:2015-11-10 00:08:31
【问题描述】:

我正在尝试通过 javascript 检测 google 重新验证码的“无效站点密钥”错误,以便可以将错误报告给服务器以进行进一步处理。我正在使用显式渲染模式并调用api函数grecaptcha.render('iframeid', {'site-key':'xxx'});虽然这个函数不会返回任何错误响应或抛出异常,即使它加载了以下内容:

我也不能简单地读取加载的错误文本,因为它是在不同域的 iframe 中加载的。无论如何,是否可以通过 javascript 或服务器端自动检测无效的站点密钥?

编辑 最终解决方案是使用 phantomjs 加载测试页面并解析 recaptcha 的 html

【问题讨论】:

  • 为什么需要to detect the 'Invalid site key'?你不能在谷歌recaptcha管理页面上做吗?
  • 在实时推送新站点时忘记更新仪表板中允许的域是一个常见错误。我们希望能够自动检测 recaptcha 何时失败,并自动将电子邮件发送给开发人员以便修复它。更具体地说,我们正在寻找 Invalid domain 错误,尽管应该检测到 recaptcha 的任何错误。
  • 亲自联系我以获得进一步的帮助。

标签: javascript recaptcha


【解决方案1】:

由于 Google 没有提供正式的检查方式,我刚刚实施了一种解决方法,在 Google 的 Recaptcha URL 上执行 GET 请求。我已经使用 PHP,但不难适应 JavaScript 的解决方案,尽管它可能因 Same Origin Policy 而以跨源错误结束。因此,如果有人使用 JavaScript 测试此解决方案,请告诉我们它是如何进行的(如果它不起作用,始终可以在您自己的服务器上运行 AJAX 并直接从您的服务器检查有效性)。

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

  1. 首先,您应该挂载您的 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 也是如此)。

  1. 然后,您对该 URL 执行 GET 请求。在 PHP 上,您可以使用cURL。如果是 Wordpress,可以使用wp_remote_get。在 JavaScript(实际上是 jQuery)上,您可以使用 $.get
    $.get( recaptcha_url, function(data, status){ ... });
  1. 最后,检查响应正文是否包含字符串'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 可以同时更改请求和响应,这可能会破坏实现。但是我们对此无能为力,因为没有官方要求检查密钥。

【讨论】:

【解决方案2】:

Google 不提供验证站点密钥的方法,您也不能通过 JS 破解/访问 reCaptcha html 代码,因为 reCapthca 位于 iframe 中,并且框架的代码不能以编程方式访问客户端。

在实时推送新网站时忘记更新仪表板中允许的域是一个常见错误。

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

破解

另一种选择可能是您开发一个脚本,该脚本将访问感兴趣的站点,制作加载的 reCaptcha 的屏幕截图/快照,应用 OCR(例如使用 this)并在 站点键时返回结果 是否有效。

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 2015-06-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2020-11-08
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多