当前位置: 首页 > news >正文

HTTP劫持和DNS劫持

HTTP劫持和DNS劫持

首先对运营商的劫持行为做一些分析,他们的目的无非就是赚钱,而赚钱的方式有两种:

    1、对正常网站加入额外的广告,这包括网页内浮层或弹出广告窗口;

    2、针对一些广告联盟或带推广链接的网站,加入推广尾巴。例如普通访问百度首页,被前置跳转为http://www.baidu.com/?tn=90509114_hao_pg 

 ----------------------------

关于全站https必要性http流量劫持、dns劫持等相关技术 - 流风,飘然的风 - 博客园
https://www.cnblogs.com/zdz8207/p/https-framework-zatan.html

网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+ - 流风,飘然的风 - 博客园
http://www.cnblogs.com/zdz8207/p/doman-HTTPDNS-DNSPod.html

-----------------------------

    在具体的做法上,一般分为DNS劫持和HTTP劫持。

    DNS劫持:

    一般而言,用户上网的DNS服务器都是运营商分配的,所以,在这个节点上,运营商可以为所欲为。

    例如,访问http://xxx.qq.com/index.html,正常DNS应该返回腾讯的ip,而DNS劫持后,会返回一个运营商的中间服务器ip。访问该服务器会一致性的返回302,让用户浏览器跳转到预处理好的带广告的网页,在该网页中再通过iframe打开用户原来访问的地址。

    HTTP劫持:

    在运营商的路由器节点上,设置协议检测,一旦发现是HTTP请求,而且是html类型请求,则拦截处理。后续做法往往分为2种,1种是类似DNS劫持返回302让用户浏览器跳转到另外的地址,还有1种是在服务器返回的HTML数据中插入js或dom节点(广告)。

    在用户角度,这些劫持的表现分为:

    1、网址被无辜跳转,多了推广尾巴;

    2、页面出现额外的广告(iframe模式或者直接同页面插入了dom节点)。

-----------------------------

    处理办法:

    1、先对外网做检测,上报被劫持的情况。

            对于我这个业务而言,加推广尾巴没意义,那么就剩下植入广告的问题了。页面广告可能通过iframe方式,也可以通过dom节点方式,需要在首页检查这两种情况。

window.addEventListener('DOMNodeInserted', checkDivHijack);    
function checkDivHijack(e) {
        var html = e ? (e.srcElement.outerHTML || e.srcElement.wholeText) : $('html').html();
        var reg = /http:\/\/([^\/]+)\//g;
        var urlList = html.match(reg);
        if (!urlList || urlList.length == 0) {
            return;
        }
        reg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn|.*\.wanggou\.com)\/$/;
        var hijack = false;
        for (var i = 0; i < urlList.length; i++) {
            if (!reg.test(urlList[i])) {
                hijack = true;
                break;
            }
        }
}

 

 (注:事后发现这个url检查不够严谨,虽然劫持的情况都能发现,但也把产品原有的一些正常插入做劫持误报了。例如<a href="http://jiankang.qq.com" data-id="1">,不过这个是小细节,把正则表达式完善一下就ok了)

    2、针对被iframe加载的情况,需要先找到运营商设置的劫持规律。

            在iframe中的网页能正常打开,而不是又被拦截加iframe,可能是因为请求的url上或cookie上运营商做了标记。我们可以利用这个规则,躲过劫持。

    3、针对注入dom节点的情况,初始化时做检查,而且后续dom注入也做检查。可以检查dom中是否含有白名单以外的http链接,如果有,就可以判定为http劫持。

    4、在前端以外的处理办法还有

        a) 终端拦截所有返回包,判断ip来自黑名单(劫持的中间ip)则丢弃返回包。

                这种做法的原因是,运营商劫持http请求后,并不是完全丢弃请求包,而是做了复制,一份继续发给目标服务器,另外一份做劫持处理直接返回302。因为这个302会比目标服务器的正常返回早得多,所以用户浏览器会只认第一个302,而丢弃后到的正常返回。

                如果先把第一个302丢弃,等待后续正常返回,则问题解决。

        b) 终端拦截请求包,并拆包发送。

                运营商一般判断是否劫持,通过判断是否HTTP请求。 一般只会检测TCP连接建立后的第一个数据包,如果其是一个完整的HTTP协议才会被标记;如果并非是一个完整的HTTP协议,由于无法得到足够多的劫持信息,所以并不会被标记为HTTP协议。 

                所以,只要把请求包切得足够细,就能躲过一部分劫持(如果运营商学习“墙”大力气做多包拦截就没辙了)。

    5、当然,最终,根本解决办法是使用HTTPS,不过这个涉及到很多业务的修改,成本较高。如果劫持比例小,也许通过适当的补救做法会更好。

  来看看检测到的劫持情况:

总体1500万pv的业务,一天竟然有100万的劫持上报,即使排除一半的误报,也代表说20个用户中,就接近有1个用户出现被劫持的情况。

可见,各种小运营商(尤其是移动)很黑!

  各种劫持的手段都有:

  1、直接返回一个带广告的HTML;

  2、在原html中插入js,再通过js脚本安插广告;

  3、iframe展示原来正常网页。

转载于:https://www.cnblogs.com/zdz8207/p/10729294.html

相关文章:

  • 关于语言的争论
  • webservice学习教程(一):理论
  • C中int8_t、int16_t、int32_t、int64_t、uint8_t、size_t、ssize_t区别
  • 自制jQuery图片切换插件ImgSlider v1.0
  • CORS简介
  • 《Android/OPhone 开发完全讲义》目录
  • mac pycharm快捷键
  • asp.net architecture
  • Exchange 2010 之:1—DAG
  • 什麽才是考驗人生的跟本
  • 「【算法进阶0x30】数学知识A」作业简洁总结
  • 「线性基」学习笔记and乱口胡总结
  • F#教程:+运算符也是函数
  • 一些想法
  • C语言之数据的存储类别
  • Angular 响应式表单 基础例子
  • Angular4 模板式表单用法以及验证
  • Git初体验
  • JavaScript实现分页效果
  • jQuery(一)
  • Median of Two Sorted Arrays
  • RxJS: 简单入门
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • vue.js框架原理浅析
  • 关于字符编码你应该知道的事情
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 配置 PM2 实现代码自动发布
  • 驱动程序原理
  • 如何利用MongoDB打造TOP榜小程序
  • Android开发者必备:推荐一款助力开发的开源APP
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • (1)Android开发优化---------UI优化
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (二)linux使用docker容器运行mysql
  • (分类)KNN算法- 参数调优
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (算法)N皇后问题
  • (一) storm的集群安装与配置
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net中wcf服务生成及调用
  • .sdf和.msp文件读取
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @staticmethod和@classmethod的作用与区别
  • [51nod1610]路径计数
  • [AR Foundation] 人脸检测的流程
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [C/C++]数据结构 循环队列
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • [leetcode]_String to Integer (atoi)