繁体   English   中英

如何通过javascript检测重新验证码站点密钥是否有效?

[英]How to detect if a re-Captcha site key is valid via javascript?

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

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

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

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

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

由于您管理多个域,我建议您为所有使用的域使用一个站点密钥 为此使用安全令牌

黑客

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

由于谷歌没有提供官方方法来检查这一点,我刚刚实施了一种解决方法,在谷歌的 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 站点密钥对当前域无效时,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 可以更改请求和响应,这可能会破坏实现。 但是我们无能为力,因为没有官方电话来检查钥匙。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM