## 什么是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短標簽