2011-04-20 51 views
5

我有一个使用验证码的形式。出于某种原因,当用户提交此表单时采用了错误的重新捕获值,当页面重新呈现时,重新捕获无法呈现。的Recaptcha - 脚本标记注入失败零星

看起来发生的情况是,重新获取尝试注入一个“脚本”标签,并且偶尔(并且只在某些浏览器,某些环境和某些情况下),它没有添加该“脚本”标记到DOM。

它发生是这样的:

1)有一些内嵌JavaScript嵌入在像这样的形式:

https://www.google.com/recaptcha/api/challenge?k=<our public key> 

2)该脚本正确执行和返回如下:

var RecaptchaState = { 
site : <some value>, 
challenge : <challenge key>, 
is_incorrect : false, 
programming_error : '', 
error_message : '', 
server : 'https://www.google.com/recaptcha/api/', 
timeout : 18000 
}; 

document.write('<scr'+'ipt type="text/javascript" s'+'rc="' + RecaptchaState.server + 'js/recaptcha.js"></scr'+'ipt>'); 

3)什么之后通常的情况是,脚本标记注入页面,recaptcha.js被加载时,它会读取RecaptchaState拨打电话出去使用recaptcha来渲染图像。

但是,在某些情况下,出于某种原因,应该添加到2)中的脚本标记永远不会添加到DOM中,因此从不会加载recaptcha.js,因此从不会呈现该代码!在页面呈现完成后,我可以在控制台中看到“RecaptchaState”存在并且具有正确的值,只是没有脚本标记可以与它一起使用。

所以,这就是正在发生的事情,我真的很为难,为什么。我只能在Firefox中重现这一点,奇怪的是,它只发生在某些条件下。例如,如果我通过fiddler路由请求,它将每次都工作,永远不会失败。如果我在提交请求之前清除了缓存,它将每次都有效。有时候,当我期待它失败时,它会起作用,反之亦然。所以它非常零星。

所以我的想法是,也许是有事情做与JS加载它与“文件撰写”语句干扰的时机。也许其他一些JavaScript会干扰它或类似的东西。只是寻找一些一般的想法,我可能会试图弄清楚,我可以运行的测试,我可以寻找的东西,或任何真正的想法。

在此先感谢

更新

仍然没有运气搞清楚了这一点。我以为有一个想法......我们在萤火虫控制台中看不到任何错误讯息,表明任何事情都会出错,尽管显然是有的。有没有我们可以用来详细了解Firefox中究竟发生了什么的公用程序?我正在考虑Chrome的“Speed-Tracer”,它会给你一个非常详细的事件时间表。这里唯一的问题是我们无法在Chrome中重现 。

+1

您是否尝试用'document.createElement'和相关函数替换'document.write'? – Lekensteyn 2011-04-20 13:56:12

+0

不是,那个代码是从recaptcha发给我们的,所以w真的不能控制它。 – JasonStoltz 2011-04-20 18:04:28

回答

4

事实证明,我们也包括通过标签管理服务的一些脚本调用Ensighten。其中一个脚本暂时使用“document.write”函数并将其更改为调用另一个函数。然而,他们在一些其他事情发生后设置回调方法,这会将“document.write”函数重置为其通常的状态。

但是,如果脚本执行的时间发生的恰到好处,让我们的验证码,而执行document.write功能是其改变的状态JavaScript的评价......它没有注入我们后续的recaptcha js到页面。

这就是说,似乎这可能被认为是侵入的修改documnet.write以这种方式,特别是对于第三方js文件。所以我问过他们是否有办法避免在代码中这样做。

+0

对此有何更新? – Blexy 2014-10-29 16:56:10

+0

我不确定他们是否修复过,我假设他们这样做。 – JasonStoltz 2014-10-31 12:22:07