关于服务器:使用js代码检测域名劫持和DNS劫持教程

3次阅读

共计 2600 个字符,预计需要花费 7 分钟才能阅读完成。

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

正文完
 0