Recaptcha - 脚本标签注入偶尔失败

时间:2011-04-20 13:43:34

标签: javascript dom recaptcha script-tag

我有一个使用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,因此从不呈现recaptcha!在页面呈现后,我可以在控制台中看到“RecaptchaState”存在且具有正确的值,只是没有脚本标记。

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

所以我的想法是,它可能与js加载的时间有关,这会干扰“document.write”语句。也许其他一些javascript正在干扰它或类似的东西。只是寻找一些关于如何尝试解决这个问题的一般性想法,我可以运行的测试,我可以寻找的东西,或任何真实的想法。

提前致谢

更新

仍然没有运气搞清楚这一点。有人以为我有......我们在firebug控制台中看不到任何错误消息,表明任何事情都会出错,尽管事情显而易见。我们可以使用任何实用程序来仔细查看Firefox中究竟发生了什么吗?我正在考虑像Chrome的“Speed-Tracer”这样的东西,它为您提供非常详细的活动时间表。这里唯一的问题是我们无法重现 它在Chrome中。

1 个答案:

答案 0 :(得分:4)

事实证明,我们还通过名为Ensighten的标记管理服务包含了一些脚本。其中一个脚本暂时支持“document.write”函数并将其更改为调用另一个函数。但是,他们在发生其他一些事情之后设置了一个回调方法,这会将“document.write”函数重置为通常的状态。

但是,如果脚本评估的时间恰到好处,以便在document.write函数处于更改状态时评估我们的recaptcha javascript ...它无法将我们后续的重新接收js注入页面。

话虽如此,似乎可以认为可以通过这种方式修改documnet.write的强制代码,特别是对于第三方js文件。所以我问过他们是否可以避免在他们的代码中这样做。