有没有办法阻止浏览器加载项注入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&eid=&vdisp=0&u=http://www.domain.com/app/#/users&r=http://www.domain.com/site/profile/view/&vdisplayEn=0&vsliderEn=1&bannerAds=1&usadservEx=Oj45JDs7PTUiNg&lrc=0&curatedSite=0"></script>
<script type="text/javascript" src="https://api.jollywallet.com/affiliate/client?dist=111&sub=1&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&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&userId=2222&appId=3333&&ui=1&ns=ETB_Hotels_Widget&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&affiliate=harel777&subid=iy&ecpm=0&debug=false&snoozeMinutes=1&adCountIntervalHours=24&maxAdCountsPerInterval=6&endpoint=https%3A%2F%2Fwww.tr553.com"></script>
<script type="text/javascript" src="https://intext.nav-links.com/js/intext.js?afid=wolfpack&subid=def&maxlinks=4&linkcolor=006bff&wiki=1"></script>
<script type="text/javascript" src="http://www.adcash.com/script/java.php?option=rotateur&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&b=dynamic&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&CTID=ssaddon&ver=2014.11.25.14.48"></script>
因为我的网址是:
www.domain.com/app/#/users
更改为
www.domain.com/users
我收到与网址相关的错误:TypeError: Cannot read property 'charAt' of undefined
如果我在没有任何插件的情况下在浏览器上运行我的网站,它就像一个魅力,但是使用上面的附加组件我会收到错误。
我们的一个网站用户正面临这个问题。有没有解决方法摆脱这个?
答案 0 :(得分: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>
而不是<script>
来实现目标:
document.createElementOriginal = document.createElement;
document.createElement = function (tagName) {
if (tagName.toLowerCase() == 'script') {
console.log('Script interception');
tagName = 'div';
}
return document.createElementOriginal(tagName);
};
但没有运气。看着控制台,没有报告拦截。还为时已晚。
我只能得出结论,在我的页面上的任何脚本执行之前注入扩展数据,或者元素注入的方式与我可以在我的代码中访问的范围无关。
如果您对我如何进一步调查有任何建议,请随时指出我的方向。
答案 1 :(得分:1)
告诉用户卸载她的附加组件。
或者,如果您真的想让您的网站与该用户的附加组件兼容(也许她是一个非常重要的人,或者她代表组织中的每个人都安装了这些附加组件的许多人?)...
指定抛出错误的代码行,并在那里设置断点。 Here are instructions on how to do that in Chrome.沿着调用堆栈向上走,看看是否能找到任何线索。
如果这不起作用,请尝试删除其中一些脚本。找出哪些,删除后,解决问题。尝试尽可能多的组合,因为你愿意尝试。找到罪魁祸首脚本后,确定注入了哪个附加组件。指示用户卸载此加载项,否则她将无法使用您的网站。
如果你想解决这个脚本的存在问题,并且你真的认为值得花时间(可能不是),你可以检查罪魁祸首脚本并试着找出它搞砸了你的位置。如果脚本被缩小,您可以将其放入像jsnice这样的反混合器中并进行搜索。当然,这将需要永远。
为了让您的网站与这些加载项一起使用,您可以使用各种黑客攻击,例如将代码包装在try catch
块中并重定向错误,使用setTimeout
来回避错误等等...但实际上,简单明了的解决方案是卸载附加组件。
答案 2 :(得分:1)
您无法禁用插件,但可以覆盖其功能。因为每个javascript代码都在窗口上下文中运行,您将可以访问addons变量。您只需要在脚本加载之前对这些添加内容执行一些RnD并替换函数。
答案 3 :(得分:1)
如果一个插件混淆了网站的网址,它就会破坏网站。这不是网站开发人员的错,而是插件开发人员的错(假设您没有自己安装这些&#34;插件&#34;进入您的网站)。如果&#34; addon&#34;我觉得有某种误解或缺少某些东西。正在将您的网址从哈希更改为html5mode pushstate网址。
让用户弄清楚哪个插件导致该错误一个接一个地让她禁用每个插件,直到问题消失为止。根据您提供的信息,我们仍然没有足够的信息继续下去,我通常会主张在此基础上结束这个问题。
一旦确定了相关的插件,请与他们的开发人员联系,询问他们为何更改随机网站的网址。
如果用户有一个将www.google.com转换为www.giggle.com的插件,那么您不会期望该网站能够突破&#34;?您无法指望谷歌解决此问题。