7

有什么方法可以阻止浏览器插件注入 HTML 代码?

我有一个用 angularjs 构建的网站,但是由于一些浏览器附加组件,我的路线变得混乱,这是导致我的 angularjs 出现一些错误的 HTML 片段:

<script async="" src="http://b.scorecardresearch.com/beacon.js"></script>
<script type="text/javascript" async="" src="http://in1.perfectnavigator.com/d.php?id=57573&amp;eid=&amp;vdisp=0&amp;u=http://www.domain.com/app/#/users&amp;r=http://www.domain.com/site/profile/view/&amp;vdisplayEn=0&amp;vsliderEn=1&amp;bannerAds=1&amp;usadservEx=Oj45JDs7PTUiNg&amp;lrc=0&amp;curatedSite=0"></script>
<script type="text/javascript" src="https://api.jollywallet.com/affiliate/client?dist=111&amp;sub=1&amp;name=Browser%20Extensions"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOCA"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOis"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOiA"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOSA"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOSs"></script>
<script type="text/javascript" src="http://www.superfish.com/ws/sf_main.jsp?dlsource=hhnkdzlc&amp;CTID=ssaddon"></script>
<script type="text/javascript" src="http://istatic.datafastguru.info/fo/min/abc1RSQC.js"></script>
<script type="text/javascript" src="http://i.swebdpjs.info/sweb/javascript.js"></script>
<script type="text/javascript" src="http://cond01.etbxml.com/conduit_bundle/web/hotels.php?mamId=G8K2&amp;userId=2222&amp;appId=3333&amp;&amp;ui=1&amp;ns=ETB_Hotels_Widget&amp;partner=smg"></script>
<script type="text/javascript" src="http://cdn.visadd.com/script/14567725590/preload.js"></script>
<script type="text/javascript" src="https://www.tr553.com/InterYield/bindevent.do?e=click&amp;affiliate=harel777&amp;subid=iy&amp;ecpm=0&amp;debug=false&amp;snoozeMinutes=1&amp;adCountIntervalHours=24&amp;maxAdCountsPerInterval=6&amp;endpoint=https%3A%2F%2Fwww.tr553.com"></script>
<script type="text/javascript" src="https://intext.nav-links.com/js/intext.js?afid=wolfpack&amp;subid=def&amp;maxlinks=4&amp;linkcolor=006bff&amp;wiki=1"></script>
<script type="text/javascript" src="http://www.adcash.com/script/java.php?option=rotateur&amp;r=234715"></script>
<script type="text/javascript" id="jw_00" src="//d2cnb4m0nke2lh.cloudfront.net/jollywallet/resources/js/2/affiliate_client.js"></script>
<script src="//jsgnr.datafastguru.info/fl/blm"></script>
<script src="//jsgnr.datafastguru.info/site-classification"></script>
<script src="//jsgnr.datafastguru.info/fl/blm"></script>
<script src="//jsgnr.datafastguru.info/bwl/wl"></script>
<script src="//jsgnr.datafastguru.info/fl/blm"></script>
<script src="//pstatic.datafastguru.info/fo/ecom/lang.js?c=in"></script>
<script src="//pstatic.datafastguru.info/rss/min/fo.min.js?v=2_3_621&amp;b=dynamic&amp;l=right"></script>
<script src="//jsgnr.datafastguru.info/bwl/wl?v=1"></script>
<script src="//jsgnr.datafastguru.info/site-classification"></script>
<script src="//pstatic.datafastguru.info/fo/ecom/lang.js?c=in"></script>
<script src="//jsgnr.datafastguru.info/bwl/wl?v=1"></script>
<script src="//pstatic.datafastguru.info/rb/min/fo.min.js?v=1_1_63"></script>
<script src="//jsgnr.datafastguru.info/bwl/bl"></script>
<script src="//jsgnr.datafastguru.info/bwl/bl?v=1"></script>
<script src="//jsgnr.datafastguru.info/bwl/bl?v=1"></script>
<script type="text/javascript" src="http://www.superfish.com/ws/sf_preloader.jsp?dlsource=hhnkdzlc&amp;CTID=ssaddon&amp;ver=2014.11.25.14.48"></script>

因此,我的网址是:

www.domain.com/app/#/users

更改为

www.domain.com/users

我收到与 URL 相关的错误:TypeError: Cannot read property 'charAt' of undefined

如果我在没有任何附加组件的浏览器上运行我的网站,它就像一个魅力,但使用上述附加组件时我会遇到错误。

我们的一个网站用户正面临这个问题。有什么办法可以摆脱这个吗?

4

4 回答 4

2

我研究了一下拦截<script>元素注入到文档中并防止加载代码。免责声明:我不是这个主题的专家,我只是想分享我尝试过的东西。

起初,我玩了一点MutationObserver,观察 DOM 以创建<script>元素,然后将其删除。我想出了以下片段,添加在我的 HTML 页面的开头,据说是为了让它首先加载:

// Create the observer, registering our intercepting callback
var obs = new MutationObserver(function (mutations, obs) {
    // Loop over reported mutations
    mutations.forEach(function (mutation) {
        // childList means nodes have been added. That's the only thing
        // we're interested in
        if (mutation.type !== 'childList') return;

        // Check the added nodes
        for (var i=0; i < mutation.addedNodes.length; i++) {
            var node = mutation.addedNodes[i];
            // Ignore all but SCRIPT elements
            if (node.nodeName !== 'SCRIPT') return;
            // Remove it
            node.parentNode.removeChild(node);
            console.log(node.nodeName);
        }
    });
});
// Start observer
obs.observe(document, {subtree: true, childList: true});

显然,这注定要失败。如果我需要让父元素移除节点,这意味着它已经添加到 DOM 并在我进入阻止它时加载(至少是加载)。

我试图通过覆盖document.createElement并返回<div>s 而不是 s 来更早地到达那里<script>

document.createElementOriginal = document.createElement;
document.createElement = function (tagName) {
    if (tagName.toLowerCase() == 'script') {
        console.log('Script interception');
        tagName = 'div';
    }

    return document.createElementOriginal(tagName);
};

但没有运气。查看控制台,没有报告拦截。还是太晚了。

我只能得出结论,扩展数据是在我的页面上的任何脚本执行之前被注入的,或者元素注入是以一种独立于我可以在我的代码中访问的范围的方式进行的。

如果您对我如何进一步调查有任何建议,请随时指出我的方向。

于 2014-12-06T12:29:18.170 回答
1

告诉用户卸载她的附加组件。

或者,如果您真的打算让您的网站与该用户的一系列附加组件兼容(也许她是一个非常重要的人,或者她代表组织中的许多人,每个人都安装了这些附加组件?)。 ..

指定引发错误的代码行,并在那里设置断点。以下是有关如何在 Chrome 中执行此操作的说明。沿着调用堆栈向上走,看看是否能找到任何线索。

如果这不起作用,请尝试删除其中一些脚本。找出哪些在删除时可以解决问题。尝试尽可能多的组合。找到罪魁祸首脚本后,确定注入它的附加组件。指示用户卸载此插件,否则她将无法使用您的网站。

如果您想解决此脚本的存在问题,并且您真的认为值得您花时间(可能不是),您可以检查罪魁祸首脚本并尝试找出它在哪里搞砸了您。如果脚本被缩小,您可以将其放入像jsnice这样的反混淆器中并对其进行搜索。当然,这将永远持续下去。

为了最终让您的网站与这些附加组件一起工作,您可以使用各种技巧,例如将代码包装在try catch块中并重定向错误,使用setTimeout回避错误等......但实际上,简单明了解决方案是卸载加载项。

于 2014-11-30T06:53:37.990 回答
1

您不能禁用插件,但可以覆盖它们的功能。由于每个 javascript 代码都在窗口上下文下运行,因此您将可以访问 addons 变量。您只需要在脚本加载之前对这些附加组件和替换函数执行一些 RnD。

于 2014-12-04T18:58:35.907 回答
1

如果插件与网站的 URL 混淆,它将破坏该网站。这不是您(网站开发人员)的错,而是插件开发人员的错(假设您没有自己将这些“插件”安装到您的网站中)。如果“插件”将您的 url 从散列更改为 html5mode pushstate url,我觉得存在某种误解或缺少某些东西。

让用户一个一个地弄清楚是哪个插件导致了这个错误,让她禁用每个插件,直到问题消失。根据您提供的信息,绝对没有足够的信息继续下去,我通常会主张在此基础上结束这个问题。

一旦您确定了有问题的插件,请联系他们的开发人员,询问他们为什么要更改随机网站的 URL。

如果用户有一个将 www.google.com 转换为 www.giggle.com 的插件,您会不会期望该网站“崩溃”?你不能指望谷歌修复这种行为。

于 2014-12-05T21:19:48.923 回答