1+ /**
2+ * 反HTTP/DNS劫持模块
3+ * 白名单域名,需要注意内联css中的字体链接,如果是第三方url,请把域名加到劫持白名单中
4+ * @author : kenkozheng
5+ */
6+ ( function ( win ) {
7+
8+ var blackReg ;
9+
10+ win . HijackReport = {
11+ init : function ( config ) {
12+ if ( config . blackReg ) {
13+ blackReg = config . blackReg ;
14+ }
15+ } ,
16+
17+ watch : function ( ) {
18+ win . addEventListener ( 'DOMNodeInserted' , checkDivHijack ) ;
19+ checkIframeHijack ( ) ;
20+ document . addEventListener ( "DOMContentLoaded" , function ( ) {
21+ checkDivHijack ( ) ;
22+ } , false ) ;
23+ }
24+ } ;
25+
26+ function getURLParam ( name ) {
27+ var reg = new RegExp ( "(^|&)" + name + "=([^&]*)(&|$)" ) ;
28+ var r = location . search . substr ( 1 ) . match ( reg ) ;
29+ if ( r != null ) return decodeURIComponent ( r [ 2 ] ) ;
30+ return null ;
31+ }
32+
33+ function checkIframeHijack ( ) {
34+ var flag = 'iframe_hijack_redirected' ;
35+ if ( ! getURLParam ( flag ) ) {
36+ if ( self != top ) {
37+ var url = location . href ;
38+ var parts = url . split ( '#' ) ;
39+ if ( location . search ) {
40+ parts [ 0 ] += '&' + flag + '=1' ;
41+ } else {
42+ parts [ 0 ] += '?' + flag + '=1' ;
43+ }
44+ try { ;
45+ top . location = parts . join ( '#' ) ;
46+ } catch ( e ) {
47+ }
48+ }
49+ }
50+ }
51+
52+ function checkDivHijack ( e ) {
53+ var dom = e ? e . srcElement : document . documentElement ;
54+ if ( ! dom . outerHTML ) {
55+ return ; //e不是一个dom,只是插入一段文本
56+ }
57+
58+ var urlReg = / ( h t t p s ? : ) ? \/ \/ [ a - z A - Z 0 - 9 \. _ - ] + \. [ a - z A - Z ] { 2 , 6 } ( : [ 0 - 9 ] { 1 , 6 } ) ? \/ ? [ ^ ' " ) \s ] * / gi;
59+ var domainReg = / ^ ( h t t p s ? : ) ? \/ \/ ( [ a - z A - Z 0 - 9 \. _ - ] + \. [ a - z A - Z ] { 2 , 6 } ) / i;
60+ var badURLList = [ ] ;
61+ var nodeList = [ dom ] ;
62+ var collection = dom . getElementsByTagName ( '*' ) ; //获取到的是collection类型,没有array好用
63+ for ( var i = 0 ; i < collection . length ; i ++ ) {
64+ nodeList . push ( collection [ i ] ) ;
65+ }
66+ for ( var i = 0 ; i < nodeList . length ; i ++ ) {
67+ var node = nodeList [ i ] ;
68+ var urlList = null ;
69+ if ( node . nodeName . toUpperCase ( ) == 'IMG' && node . src && domainReg . test ( node . src ) ) {
70+ urlList = [ node . src ] ;
71+ } else if ( node . nodeName . toUpperCase ( ) == 'LINK' ) {
72+ var href = node . getAttribute ( 'href' ) ;
73+ if ( href && domainReg . test ( href ) ) {
74+ urlList = [ href ] ;
75+ }
76+ } else if ( node . nodeName . toUpperCase ( ) == 'STYLE' ) {
77+ urlList = node . innerHTML . match ( urlReg ) ;
78+ } else if ( ( node . nodeName . toUpperCase ( ) == 'IFRAME' || node . nodeName . toUpperCase ( ) == 'FRAME' ) && node . src && domainReg . test ( node . src ) ) {
79+ urlList = [ node . src ] ;
80+ } else if ( node . getAttribute ( 'style' ) ) {
81+ urlList = node . getAttribute ( 'style' ) . match ( urlReg ) ;
82+ }
83+
84+ if ( urlList ) {
85+ var hijack = false ;
86+ for ( var k = 0 ; k < urlList . length ; k ++ ) {
87+ var domain = domainReg . exec ( urlList [ k ] ) ;
88+ if ( ! domain || ! domain [ 2 ] || blackReg . test ( domain [ 2 ] ) ) {
89+ badURLList . push ( urlList [ k ] ) ;
90+ hijack = true ;
91+ }
92+ }
93+ if ( hijack ) {
94+ node . setAttribute ( 'style' , 'display:none;position:fixed;top:10000px;' ) ;
95+ console . log ( "find hijack: " + badURLList ) ;
96+ }
97+ }
98+ }
99+
100+ if ( badURLList . length ) {
101+ if ( e ) {
102+ dom . setAttribute ( 'style' , 'display:none;position:fixed;top:-10000px;' )
103+ console . log ( "find hijack: " + badURLList ) ;
104+ }
105+ }
106+ }
107+
108+ } ) ( window ) ;
109+
110+ HijackReport . init ( {
111+ blackReg : / _ _ x x x x _ r e g _ y y y y _ _ / //新的正则表达式,一般情况不需要设置这个字段
112+ } ) ;
113+ HijackReport . watch ( ) ;
0 commit comments