难以捉摸的recaptcha bug。复制代码总是失败

时间:2015-02-13 17:45:13

标签: javascript html recaptcha

我的用户中只有少量人会获得一个验证码,要求他们复制并粘贴代码,但它总是会失败 - 而大多数用户都会获得正常的复选框(复选框)。 谷歌搜索只返回三个人获取验证码的实例,其中没有任何有价值的信息

关于他们为什么会获得验证码的任何想法,最重要的是为什么它会失败?

2 个答案:

答案 0 :(得分:7)

为什么会发生这种情况:

当客户端禁用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个标记包含iframetextarea和隐藏input。禁用JavaScript时,它将呈现noscript标记的内容,它看起来像这样。

JavaScript disabled

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

解决方法:

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

答案 1 :(得分:0)

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

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

现在的问题是:如何解决问题?当reCaptcha决定呈现“复制此代码并将其粘贴到下面的空白框中” UI时,它似乎停用了通常会调用的所有普通JS回调。就像reCaptcha认为它正在不支持JavaScript的浏览器中运行一样。

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

它似乎打算包含在您发送到服务器的任何形式的数据中。由于reCaptcha认为它正在不支持JavaScript的浏览器中运行,因此希望您在服务器上进行reCaptcha验证。

但是,如果您仍然想对将代码粘贴到文本区域中的用户做出反应,则只需在input文本区域上为g-recaptcha-response事件注册事件处理程序即可。

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

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

类似的事情。