防止恶意覆盖JQuery

时间:2012-11-20 17:12:34

标签: jquery-ui jquery malware

长话短说:

我们在基于JQuery / JQueryUI的系统上记录了一段时间的错误。在它的核心,我们正在做一个非常基本的点击链接 - > JQuery AJAX GET - >打开JQueryUI模式模式。

我们得到的错误看起来很简单 - “对象不支持属性或方法'对话框'” - 让我们相信JQueryUI存在错误。在花费大量时间排除浏览器不兼容性之后,JQuery结束时代码不好,我们端的代码不好,生气的代码众神......我们抓住了幸运的假期。在办公室的其中一台机器上100%重复。

事实证明,广告软件很多 - 特别是[旧版本的] easyinline - http://www.easyinline.com。当用户点击任何链接时,将加载一连串的javascript文件,包括从谷歌的CDN重新加载JQuery。

对于大多数链接来说,这不是一个真正的问题 - 无论如何它们会让你离开页面而且所有内容都会重新加载。但是对于我们的模态,它意味着每个模态链接都会在发送请求的时候标记我们的JQuery,导致响应尝试使用'new'$,现在它将缺少JQueryUI和任何其他插件。

最初我们考虑为'我们的'JQuery创建另一个全局变量($$或者其他东西),并在我们的代码中明确地使用它而不仅仅是$。问题在于我们使用了一些依赖于$的其他第三方工具,而广告软件加载的$是一个不同的(旧版)版本。因此,正确保存$非常重要。

有什么想法吗?我知道JQuery的noConflict()方法,但在粗略一瞥之后不认为它符合要求。

2 个答案:

答案 0 :(得分:1)

最终,当我们收到任何ajax响应时(即在执行开放模式代码之前),我们决定重新建立我们的JQuery完整性。我们所有的ajax都包含在我们自己的处理程序中,所以这很容易全面注入。

基本上;

我们有原始的JQuery'已保存' - 由于我们的处理程序,我们已将其置于范围内,但它可以在加载后轻松放入单独的全局(如$$)。在我们的ajax响应处理程序中,我们有一个相当简单的检查;

if (window.$ !== $$) {
    window.$ = window.jquery = window.jQuery = $$;
}

这会将全局jquery重置为应该的状态。

答案 1 :(得分:0)

这只是一个解决方案,而不是一个完整的解决方案 你可以在这里试试多件事 1.如果您可以控制广告软件加载的内容,那么只需添加类似if(!$)的内容,他们会尝试加载jquery 2.尝试在页面末尾加载插件
3.即使页面末尾不起作用。尝试将链接(script tag使用document.write)注入Jquery文档就绪事件中的插件CDN。这将确保在所有jquery已经加载(不是首选的东西)时,最终会加载插件代码。