难以捉摸的重新验证错误。复制代码总是失败

elusive recaptcha bug. Copy code always fails

我的极少数用户得到了一个要求他们复制和粘贴代码的验证码,但对他们来说总是失败 - 而大多数用户得到的是正确通过的普通验证码(复选框)。 谷歌搜索只返回了三个人获得验证码的实例 none 其中有任何有价值的信息

关于他们为什么得到验证码以及最重要的为什么失败的任何想法?

为什么会这样:

当客户端禁用 JavaScript 时会发生这种情况。让我们看看下面的示例代码。

来自 reCAPTCHA: Tips and Guidelines API 文档的示例代码:

<script type="text/javascript"
   src="https://www.google.com/recaptcha/api/challenge?k=your_public_key">
</script>

<noscript>
   <iframe src="https://www.google.com/recaptcha/api/noscript?k=your_public_key"
       height="300" width="500" frameborder="0"></iframe><br>
   <textarea name="recaptcha_challenge_field" rows="3" cols="40">
   </textarea>
   <input type="hidden" name="recaptcha_response_field"
       value="manual_challenge">
</noscript>

正如我们所见,有 noscript 个标签包含一个 iframe、一个 textarea 和一个隐藏的 input。当禁用 JavaScript 时,它将呈现 noscript 标签的内容,它看起来像这样。

iframe 包含一个表单,用户可以在其中输入验证码并提交表单,iframe 将加载包含响应代码的新页面。由于 JavaScript 被禁用,因此将该令牌获取到父页面表单的唯一方法是让用户将令牌复制并粘贴到示例中的 textarea 中。

解决方法?:

只要用户正确复制并粘贴令牌,它应该可以正常工作。仔细检查验证码的 HTML 是否包含正确的回退元素。您也可以在浏览器中禁用 JavaScript 以自行测试。

好的,我 运行 遇到了同样的问题。很难在网上找到有关此的任何有用信息。我确实遇到过这个 post,不过:https://community.cloudflare.com/t/urgent-problem-with-cloudflare-recaptcha-and-firefox/87307/3

它包含我最终可靠地重现问题所需的信息:将您的用户代理字符串设置为 Firefox/24.0。 (此 link 告诉您如何在浏览器中执行此操作:https://www.howtogeek.com/113439/how-to-change-your-browsers-user-agent-without-installing-any-extensions/

现在的问题是:如何解决这个问题?当 reCaptcha 决定呈现 "Copy this code and paste it in the empty box below" UI 时,它似乎停用了它通常会调用的所有正常 JS 回调。这几乎就像 reCaptcha "thinks" 在不支持 JavaScript.

的浏览器中 运行ning

它仍会在 DOM 中呈现 g-recaptcha-response 文本区域。通常该文本区域是隐藏的,但在这种模式下它是可见的。这是用户应将代码粘贴到的 "box"。

它似乎旨在包含在您发送到服务器的任何表单数据中。由于 reCaptcha "thinks" 它 运行 在不支持 JavaScript 的浏览器中运行,它希望您在服务器上进行 reCaptcha 验证。

但是,如果您仍想对用户将代码粘贴到文本区域做出反应,您可以简单地为 g-recaptcha-response 文本区域上的 input 事件注册一个事件处理程序。

let captchaTextarea = document.querySelector("textarea[name='g-recaptcha-response']")

if (captchaTextarea) {
    captchaTextarea.addEventListener("input", () => {
        console.log("Received reCaptcha input: ", captchaTextarea.value)
    }, false)
} 

类似的东西。