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%。