(ok)拦截网络运行商恶意注入的静态脚本
问题描述
通过PC使用网络时,页面代码加载正常
通过手机,使用4G访问时,页面代码加载也正常
但在使用wifi访问网站时,查看网站源代码,页面底部多出来的一部分代码,这些代码通过<script>引入了三个静态脚本文件,如下:
被注入的代码:
...省略..... </body> <script src="https://cdn.bootcss.com/clipboard.js/1.7.1/clipboard.js"></script> <script src="https://cdn.bootcss.com/jquery/1.8.3/jquery.min.js"></script> </html>
正常的应该是这样:
...省略..... </body> </html>
分析
根据出现的问题,推测造成错误的原因应该是:在使用手机,链接wifi访问网站时,网络运营商会在网站底部注入以上的代码。
解决方法
通过html5提供的api:Mutation Observer(变动观察器)对代码进行检测,当检测到引入有非正常的静态脚本文件时,进行拦截,代码如下:
<script type="application/javascript"> // MutationObserver 的不同兼容性写法 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; // 该构造函数用来实例化一个新的 Mutation 观察者对象 // Mutation 观察者对象能监听在某个范围内的 DOM 树变化 var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { // 返回被添加的节点,或者为null. var nodes = mutation.addedNodes; for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; if (/bootcss/i.test(node.src)) { try { node.parentNode.removeChild(node); console.log('拦截可疑静态脚本:', node.src); } catch (e) {} } } }); }); // 传入目标节点和观察选项 // 如果 target 为 document 或者 document.documentElement // 则当前文档中所有的节点添加与删除操作都会被观察到 observer.observe(document, { subtree: true, childList: true }); </script>
检验
如果拦截成功,在控制台可以看到,如下图所示