【问题标题】:Recaptcha - Script tag injection failing sporadicallyRecaptcha - 脚本标签注入偶尔失败
【发布时间】:2011-08-09 12:49:51
【问题描述】:

我有一个使用 reCAPTCHA 的表单。由于某种原因,当用户提交此表单时使用了错误的 recapture 值,当页面重新渲染时,recapture 无法渲染。

看起来正在发生的事情是重新捕获尝试注入“脚本”标签,并且偶尔(并且仅在某些浏览器、某些环境和某些场景中),它未能将该“脚本”标签添加到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 中重现这一点,奇怪的是,它只在某些条件下发生。例如,如果我通过提琴手路由请求,它每次都会工作,永远不会失败。如果我在提交请求之前清除缓存,它每次都会起作用。有时,当我预计它会失败时,它会起作用,反之亦然。所以很零星。

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

提前致谢

更新

仍然没有运气弄清楚这一点。我有一个想法......我们在萤火虫控制台中没有看到任何错误消息,这表明任何事情都出了差错,尽管显然有些事情。我们可以使用任何实用程序来仔细查看 Firefox 中到底发生了什么?我正在考虑类似 Chrome 的“Speed-Tracer”之类的东西,它可以为您提供非常详细的事件时间表。这里唯一的问题是我们无法重现 它在 Chrome 中。

【问题讨论】:

  • 你试过用document.createElement替换document.write和相关函数吗?
  • 不,该代码是从 recaptcha 发送给我们的,所以我们无法控制它。

标签: javascript dom recaptcha script-tag


【解决方案1】:

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

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

话虽如此,以这种方式修改 documnet.write 似乎可以被认为是对 ensighten 代码的侵入,尤其是对于第三方 js 文件。所以我问他们是否有办法避免在他们的代码中这样做。

【讨论】:

  • 我不确定他们是否修复了这个问题,我假设他们已经修复了。
猜你喜欢
  • 2018-08-08
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多