使用js代码检测域名劫持和DNS劫持教程

1、对于DIV注入的,可以初始化时检查全部html代码。
检测是否被劫持比较简单,但对抗就略麻烦,这个在说完第2点之后再解释。
IIS7网站监控可以及时防控网站风险,快速准确监控网站是否遭到各种劫持攻击,网站在全国是否能正常打开(查看域名是否被墙),精准的DNS污染检测,具备网站打开速度检测功能,第一时间知道网站是否被黑、被入侵、被改标题、被挂黑链。精益求精的产品,缺陷为零数据提供!
它可以做到以下功能:
1、检测网站是否被黑
2、检测网站是否被劫持
3、检测域名是否被墙
4、检测DNS是否被污染
5、网站真实的完全打开时间(独家)
6、拥有独立监控后台,24小时定时监控域名
官方图:
image
官方地址: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情况就更复杂了。可能是