## 什么是HTTP劫持?
在用户的客户端与其要访问的服务器经过网络协议协调后,二者之间建立了一条专用的数据通道,用户端程序在系统中开放指定网络端口用于接收数据报文,服务器端将全部数据按指定网络协议规则进行分解打包,形成连续数据报文。
## HTTP网络劫持的原理
在用户的浏览器连上被访问的网站服务器,发送了HTTP请求后,运营商的路由器会首先收到此次HTTP请求,之后运营商路由器的旁路设备标记此TCP连接为HTTP协议,之后可以抢在网站服务器返回数据之前发送HTTP协议的302代码进行下载软件的劫持,浏览器收到302代码后就会跳转到错误的软件下载地址下载软件了,随后网站服务器的真正数据到达后反而会被丢弃。或者,旁路设备在标记此TCP连接为HTTP协议后,直接返回修改后的HTML代码,导致浏览器中被插入了运营商的广告,随后网站服务器的真正数据到达后最终也是被丢弃。
从上述原理中看出,如果需要进行HTTP劫持,首先需要进行标记:如果是HTTP协议,那么进行劫持,否则不进行劫持。
常见的http劫持有DNS劫持和内容劫持。
### DNS劫持
在浏览器输入如下域名 `www.test.com`,那浏览器要打开这个网站,首先要解析域名`www.test.com`,结果这个域名被黑客劫持到他的私人服务器1.2.3.4,结果我的浏览器和他 的私人服务器1.2.3.4建立SSL连接,他的服务器1.2.3.4也和www.test.com建立SSL的连接,我收发的数据都通过他的服务器1.2.3.4中转,也就是黑客的服务器1.2.3.4相当于一个https代理服务器,结果我收发的所有数据,他都能看到。这种攻击就是中间人攻击,跳转1.2.3.4就是DNS劫持,DNS被劫持到一个非源端的IP上。
1. 中间人截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;将服务器返回给客户端的内容发送给客户端,伪装成服务器与客户端进行通信。
2. 通过这样的手段,便可以获取客户端和服务器之间通信的所有内容。
3. 使用中间人攻击手段,必须要让客户端信任中间人的证书,如果客户端不信任,则这种攻击手段也无法发挥作用。
### 内容劫持
作为中间人,没有服务器的私钥,是不能解密客户端发送的内容的,若没有客户端自己生成的秘钥,就不能解密客户端发送的内容
PS:
1.CA证书保证了公钥的可靠性。
2.服务端私钥+公钥的非对称加解密保证了客户端生成的随机数传输安全,不会被中间人拦截获取。但是非对称加密对服务端开销大。
3.所以利用随机数的对称加密保证后续通讯的安全性,也可以降低服务器的解密开销。
4.HTTPS只针对传输内容进行加密,保证的是客户端和网站之间的信息就算被拦截也无法破解。如果不是全站HTTPS,仅仅只是在登录页采用HTTPS,那些HTTP连接的页面同样是危险的,从HTTP->HTTPS跳转依然可能被劫持。
---
## 如何预防HTTP劫持
因为使用中间人攻击,必须让客户端信任中间人的证书
1、证书校验:针对安全性要求比较高的 app,可采取客户端预埋证书的方式锁死证书,**只有当客户端证书和服务端的证书完全一致的情况下才允许通信**,如一些银行类的app,但这种方式面临一个问题,证书过期的问题,因证书有一定的有效期,当预埋证书过期了,只有通过强制更新或者要求用户下载证书来解决
2、域名检验
## HTTP被劫持怎么办?
如果确认遭遇了HTTP劫持,可以向ISP(互联网服务提供商,即向广大用户综合提供互联网接入业务、信息业务、和增值业务的电信运营商。)客服强烈投诉,来达到免于被劫持的目的。因为劫持技术本身设计中包括类似黑名单的功能,如果收到宽带用户的强烈反对,ISP会将该用户放入"黑名单"过滤掉,于是用户在短期内就不会遇到劫持的情况了。
HTTPS的出现对利用网络劫持的企业来说,无疑是一个巨大的打击。HTTPS的出现,通过对数据的加密,使得第三方难以修改我们的数据内容。就像字条上的文字只有甲方跟丙方能够看懂,作为乙方根本不知道纸条上写的是什么内容,就不从下手对内容进行修改。同时,给字条加上信封,再加上一次性的印戳,使得乙方根本无法看到字条上的内容,因为一旦拆开信封,丙方就知道自己的信息被第三方看到了,从而对纸条内容产生怀疑。SSL证书就像信封,把我们的数据放在里面,只有指定的一方可以解读这个数据,一旦数据被第三方劫持,接受数据的用户就会产生不信任,从而丢弃数据。
- 序言
- 从业感悟
- 常用名词
- HTML
- JS
- ES6新特性
- jquery和vue对比
- 彻底理解this
- JQuery添加自定义函数
- js的实现
- 原始值和引用值
- MYSQL
- 简介
- 术语
- 特点
- 范式
- 数据类型1
- 数据类型2
- 编码
- 权限管理
- 事务
- mvvc
- 引擎
- MyISAM与InnoDB区别
- 索引类型
- 锁
- 死锁
- 分层架构
- 执行计划
- join原理
- 高可用
- 日志类型
- 分库分表
- 中间件
- 服务器
- 操作系统
- 信号量 锁 队列
- PHP
- composer加载原理
- composer基础知识
- 自动加载函数
- composer加载代码
- composer 自动加载
- 内存管理
- PHP执行流程
- cgi,fastCgi,php-fpm
- HTTP
- 错误码
- 跨域请求
- 面试
- 安全
- HTTP劫持
- 设计模式
- 如何正确的使用设计模式
- 单例模式
- 原型模式
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
- 设计原则
- 算法
- PHP短标签