本文整理自HSTS學習筆記、 HSTS詳解、什麼是中間人攻擊?如何避免?這三篇的文章java
「中間人攻擊(MiTM)」就是當數據離開一個端點前往另外一個端點時,傳輸的期間即是對數據失去控制的時候。當一個攻擊者將本身置於兩個端點並試圖截獲或阻礙數據傳輸時,便稱爲中間人(MiTM)攻擊。web
談及MiTM時,並非只有一種方式能夠形成損害——答案是四種!通常說來,有嗅探、數據包注入、會話劫持和SSL剝離。apache
嗅探:嗅探或數據包嗅探是一種用於捕獲流進和流出系統/網絡的數據包的技術。網絡中的數據包嗅探就好像電話中的監聽。記住,若是使用正確,數據包嗅探是合法的;許多公司出於「安全目的」都會使用它。瀏覽器
數據包注入:在這種技術中,攻擊者會將惡意數據包注入常規數據中。這樣用戶便不會注意到文件/惡意軟件,由於它們是合法通信流的一部分。在中間人攻擊和拒絕式攻擊中,這些文件是很常見的。安全
會話劫持:你曾經遇到過「會話超時」錯誤嗎?若是你進行過網上支付或填寫過一個表格,你應該知道它們。在你登陸進你的銀行帳戶和退出登陸這一段期間便稱爲一個會話。這些會話一般都是黑客的攻擊目標,由於它們包含潛在的重要信息。在大多數案例中,黑客會潛伏在會話中,並最終控制它。這些攻擊的執行方式有多種。服務器
SSL剝離:SSL剝離或SSL降級攻擊是MiTM攻擊的一種十分罕見的方式,可是也是最危險的一種。衆所周知,SSL/TLS證書經過加密保護着咱們的通信安全。在SSL剝離攻擊中,攻擊者使SSL/TLS鏈接剝落,隨之協議便從安全的HTTPS變成了不安全的HTTP,從而截獲用戶的傳輸內容。網絡
HSTS(HTTP Strict Transport Security) 是一種Web安全協議,它的做用是在本地強制客戶端(如瀏覽器)使用HTTPS與服務器建立鏈接。服務器開啓HSTS的方法是,當客戶端經過HTTPS發出請求時,在服務器返回的超文本傳輸協議響應頭中包含STS(Strict-Transport-Security)字段。dom
語法規則工具
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
複製代碼
各個參數的意義學習
Strict-Transport-Security
,並設置max-age等參數;Strict-Transport-Security
,並設置max-age等參數;所以,若是使用了HSTS,就能防止第一次80請求出問題,它的作法就是不通過網絡而是直接在瀏覽器內部改寫地址和請求方式。對應於以前的例子,就至關於你一開始就擁有了一隻神奇的筆,用它寫下來的文字只有你和銀行才能看得懂,我卻看不懂。而我拿着這些文字信息到銀行後只能換一個保險櫃,保險櫃的密碼只有你和銀行知道,所以我也拿不到裏面的錢。所以,HSTS有助於安全性的提高。
HSTS主要針對如下三個威脅:
HSTS針對以上三個威脅的解決方案:
如前所述,若沒有使用HSTS,雖然會出現安全警告,可是仍可選擇繼續不安全的鏈接。而若是使用了HSTS,則沒法繼續不安全的連接。
利用HSTS,還能夠節省一次302/301跳轉請求。若是瀏覽器已經記住對應網址的HSTS規則,每次對其進行http訪問時,都會在瀏覽器內部直接307跳轉到https,不用先80到服務器而後再被告知443端口訪問,節省資源和時間。
最後,使用HSTS的優勢是能夠強制客戶端使用HTTPS訪問頁面,避免中間人劫持;免去一次302/301的跳轉請求,直接進行HTTPS鏈接,節省時間和資源。更加安全和高效。可是它也存在一些缺點:
修改配置文件,如/etc/apache2/sites-enabled/websites.conf和/etc/apache2/httpd.conf
,在VirtualHost中增長如下內容:
# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so
<VirtualHost 67.89.123.45:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
</VirtualHost>
複製代碼
4.2 Lighttpd
修改配置文件,如/etc/lighttpd/lighttpd.conf
,而後重啓Lighttpd便可:
server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
setenv.add-response-header = ("Strict-Transport-Security" => "max-age=63072000; includeSubdomains; ")
}
複製代碼
4.3 Nginx
將如下內容添加到https的配置文件中便可:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; ";
複製代碼
利用Chrome的開發者工具,分別對
進行實驗,能夠發現taobao, douban, google已經開始使用HSTS,並且在輸入上面網址的時候能夠看到307狀態碼,在瀏覽器內部切換到https進行訪問。而訪問http://www.baidu.com的時候,仍是隻有302,屢次訪問仍舊如此,說明百度首頁尚未使用HSTS,還是先80端口訪問而後服務器再返回302告訴瀏覽器要用443端口進行https訪問。