网页劫持

    web前端安全除了平常的XSS、CSRF外还存在一种安全问题就是网页劫持。所谓的网页劫持就是非法的网页被修改拦截了。来看下面的具体解释。

什么是网页劫持:
       使用HTTP请求请求一个网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文,让客户端(通常是浏览器)展示“错误”的数据,通常是一些弹窗,宣传性广告或者直接显示某网站的内容。

分类
    I、 跳转型劫持 :用户输入地址A,但是跳转到地址B
    II、 注入型劫持 :过在正常的网页中注入广告代码(js、iframe等),实现页面弹窗提醒或者底部广告等。
         1),注入js类劫持:在正常的页面注入js代码实现劫持。
         2),iframe类劫持:将正常网页嵌套iframe或者页面增加iframe。
         3),篡改页面类劫持:正常页面出现多余的劫持网页标签,导致页面整体大小发生变化。
  
防御
    1.  跳转型劫持,若用单纯靠Web页面进行检测比较困难
    2.  注入JS类:
          1) 改写document.write方法
          2) 遍历页面script标签,给外链JS增加白名单,不在白名单内js外链都上报
    3.iframe类:
          比较window.self 和window.top 或  比较parent 和 window,同时可增加白名单
          获取正确地址
           function getCorrectUrl() {
               var url ; 
                if(parent != window) {
                    try   {
                       url = parent.location.href;
                    }catch(){ 
                        url = document.referrer
                    }
                }
            }
     4.特殊方式
        类似电信捏造在白名单内的js URL和篡改页面内容的,我们用上面提到的方法检测不到这些信息,如果是在APP内,可以做的事情就比较多了,除了上面之外,还可以比较页面的 content-length。
    script内核心代码如下:
      function hiJackSniffer ()  
      var files = $ . toArray ( D . querySelectorAll ( 'script[src]' ));
      var arr =[];
      for ( var i = 0 , len = files . length ; i < len ; i ++){
        files [ i ]. src && arr . push ( files [ i ]. src );
          }
      if ( arr . length ){  
        return sendImg ( arr , 1 );
           }
      arr = getParentUrl ();
        if ( arr && arr . length ){   //被嵌入iframe
         return sendImg ([ arr ], 2 );
      }
       if ( D . documentElement . outerHTML . length > 4e3 ){
          var tmp ={};
          var headjs = $ . toArray ( D . head . querySelectorAll ( 'script' ));
         var unknownCode =[];
          if ( headjs . length ){
               unknownCode = unknownCode . concat ( headjs . map ( function ( v ){  
           return v . innerHTML ;
                 }). filter ( function ( v ){
            return !! v ;
          }));
         }
        var body = $ . toArray ( D . body . querySelectorAll ( '*' ));
         if ( body . length > 1 ){
           unknownCode = unknownCode . concat ( body . map ( function ( v )  
                    return v . outerHTML . split ( '\n' ). join ( '' )
                }). filter ( function ( str ){
                if ( /^

你可能感兴趣的:(Web前端,Javascript,web安全)