1、对于DIV注入的,能够初始化时查看全副html代码。
检测是否被劫持比较简单,但反抗就略麻烦,这个在说完第2点之后再解释。
IIS7网站监控能够及时防控网站危险,疾速精确监控网站是否受到各种劫持攻打,网站在全国是否能失常关上(查看域名是否被墙),精准的DNS净化检测,具备网站关上速度检测性能,第一工夫晓得网站是否被黑、被入侵、被改题目、被挂黑链。精益求精的产品,缺点为零数据提供!
它能够做到以下性能:
1、检测网站是否被黑
2、检测网站是否被劫持
3、检测域名是否被墙
4、检测DNS是否被净化
5、网站实在的齐全关上工夫(独家)
6、领有独立监控后盾,24小时定时监控域名
官网图:


官网地址:IIS7网站监控
2、对于js注入,能够在window监听DOMNodeInserted事件。
事件有srcElement,能够获取到刚插入的dom节点。
这里开始简略粗犷的做正则匹配,匹配所有url。
再一一比拟是否白名单域名,如果不是,则断定为劫持。能够上报,同时能够移除dom.parentNode.removeChild(dom);
但这样容易造成误伤,因为失常页面中可能有内部链接,或者一些纯文本url。

function checkDivHijack(e) {    var html = e ? (e.srcElement.outerHTML || e.srcElement.wholeText) : $('html').html();    var reg = /http:\/\/([\w.:]+\/)[^'"\s]+/g;    var urlList = html.match(reg);    if (!urlList || urlList.length == 0) {        return;    }    reg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn|.*\.wanggou\.com|.*\.jd\.com)\/$/;    var hijack = false;    for (var i = 0; i < urlList.length; i++) {        if (!reg.test(urlList[i])) {            hijack = true;            break;        }    } }

起初改为

function checkDivHijack(e) {    var dom = e ? e.srcElement : document.documentElement;    if (!dom.outerHTML) {        return;     //e不是一个dom,只是插入一段文本    }    var imgList = (dom.nodeName.toUpperCase() == 'IMG') ? [dom] : dom.getElementsByTagName('img');    if (!imgList || imgList.length == 0) {        return;    }    var httpReg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn)\//;    var base64Reg = /^data:image/;    var src;    var hijack = false;    for (var i = 0; i < imgList.length; i++) {        src = imgList[i].src;        if (!httpReg.test(src) && !base64Reg.test(src)) {            hijack = true;            break;        }    } }

但这样也有破绽,如果运营商通过div+style设置背景的形式显示广告图,上述代码就无奈查看进去。

那么,就还须要查看style的状况,但style状况就更简单了。可能是<style>,也可能是inline款式,最终还是要回到url辨认上。
那么做个折衷,咱们持续用最后的纯文本正则匹配url的形式,但跳过纯文本的状况(例如批改div的内容,替换为一段文本),只查看插入dom的状况。
具体方法是

    if (!dom.outerHTML) {        return;     //e不是一个dom,只是插入一段文本    }

回到方才第一点的问题,监测第一点的状况,能够用一样的做法。然而,反抗就麻烦很多,因为广告dom节点能够插在body第一层,也能够插在某个内容div中。如果简略粗犷的把广告dom节点到body的全副div都移除,可能会造成大面积的误伤。
所以,针对这个状况,咱们还在做进一步的监测统计。

3、对于iframe的状况,要检测非常简单,只须要比拟self和top是否雷同。
不过,要残缺解决这个嵌套劫持,就要晓得运营商的小把戏。
试想一下,iframe前,申请http://www.host.com/xxx.html ,就被劫持,302重定向到一个iframe的页面,这个页面应用iframe从新加载咱们原来要申请的html。
那么,此时在iframe中的html为什么可能顺利加载回来呢?而不是又被劫持?
咱们猜测,运营商应该在url中加了一个参数,标记是否曾经劫持过。
而理论监测发现,咱们的猜测也是正确的。

呃,咱们认真看,还能够发现运营商做这个劫持也十分粗犷,如果页面依赖hash,就会引起谬误了。
Image

见招拆招,这个比拟好办,咱们只须要把top的地址批改为self地址即可。一来冲掉iframe,二来绕过劫持。

function checkIframeHijack() {    var flag = 'iframe_hijack_redirected';    if (getURLParam(flag)) {        sendHijackReport('jiankang.hijack.iframe_ad', 'iframe hijack: ' + location.href);    } else {        if (self != top) {            var url = location.href;            var parts = url.split('#');            if (location.search) {                parts[0] += '&' + flag + '=1';            } else {                parts[0] += '?' + flag + '=1';            }            try {                top.location = parts.join('#');            } catch (e) {            }        }    }}

为了平安起见,避免运营商有新招数,所以这里只尝试一次,用iframe_hijack_redirected参数标记,曾经尝试过。

依照统计状况来看,运营商还是挺猖獗的,均匀大概有6~10个劫持上报,大略占整个QQ衰弱用户的3%到5%。