HSTP——HTTP嚴(yán)格傳輸安全
HTTP Strict Transport Security (HSTS) - HTTP嚴(yán)格傳輸安全
1. 由來:啟用HTTPS也不能保證足夠安全
很多網(wǎng)站對外只開放HTTPS,但用戶再訪問某個(gè)網(wǎng)站的時(shí)候,在瀏覽器中卻往往只輸入網(wǎng)站域名,例如(example.com),而不是( https://example.com ),不過瀏覽器依然能正確的使用HTTPS發(fā)起請求,這個(gè)是由于瀏覽器在背后的協(xié)作。
簡單說就是瀏覽器向server發(fā)起了一次HTTP請求,在得到一個(gè)重定向響應(yīng)后,發(fā)起一次HTTPS請求并得到最終的響應(yīng)內(nèi)容,這看起來是個(gè)不錯(cuò)的用戶體驗(yàn)。
但在建立起HTTPS連接之前存在一次明文的HTTP請求和重定向,使得攻擊者可以以中間人的方式劫持這次請求,從而進(jìn)行后續(xù)的攻擊,例如竊聽、篡改、跳轉(zhuǎn)釣魚網(wǎng)站等。
劫持請求并跳轉(zhuǎn)釣魚網(wǎng)站為例
- 瀏覽器發(fā)起一次明文HTTP請求,但實(shí)際會(huì)被攻擊者攔截下來
- 攻擊者作為代理,把當(dāng)前請求轉(zhuǎn)發(fā)到釣魚網(wǎng)站
- 釣魚網(wǎng)站返回假冒的網(wǎng)頁內(nèi)容
- 攻擊者把假冒的網(wǎng)頁內(nèi)容返回給瀏覽器
在整個(gè)過程中,攻擊者直接劫持了HTTP請求,并返回內(nèi)容給瀏覽器,根本不給瀏覽器建立HTTPS連接的機(jī)會(huì),因此瀏覽器會(huì)誤以為真是網(wǎng)站通過HTTP對外提供服務(wù),自然就不會(huì)向用戶報(bào)告當(dāng)前的連接不安全,于是攻擊者可以對請求和響應(yīng)進(jìn)行竊聽和篡改。
2. 解決方法:使用HSTS
劫持出現(xiàn)在HTTPS連接前的HTTP連接,那么解決這個(gè)問題的思路自然就變成了如何避免出現(xiàn)這樣的HTTP請求,我們期望的瀏覽器行為是:用戶輸入域名(example.com),瀏覽器直接將其轉(zhuǎn)換為HTTPS請求( https://example.com ),直接略過上述的HTTP請求和重定向,從而使得中間人攻擊失效
期望行為
- 用戶在瀏覽器輸入域名,瀏覽器得知該域名應(yīng)該使用HTTPS進(jìn)行通信
- 瀏覽器直接向網(wǎng)站發(fā)起HTTPS請求
- 網(wǎng)站返回相應(yīng)內(nèi)容
但是瀏覽器如何知道該域名應(yīng)該是用HTTPS通信呢?
2.1 HSTS
HSTS全稱是HTTP Strict Transport Security, 他是一個(gè)Web安全策略機(jī)制(web security policy mechanism)
HSTS最為核心的是一個(gè)HTTP響應(yīng)頭(HTTP Response Header)。通過這響應(yīng)頭讓瀏覽器得知,在接下來的一段時(shí)間內(nèi),當(dāng)前域名只能通過HTTPS進(jìn)行訪問,并且在瀏覽器發(fā)現(xiàn)當(dāng)前連接不安全的情況下,強(qiáng)行拒絕用戶的后續(xù)訪問要求
HSTS Header的語法:
Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]
其中
- max-age 必填參數(shù),秒為單位的數(shù)值,代表著HSTS Header的過期時(shí)間,通常設(shè)置為1年,即31536000秒
- includeSubDomains 可選參數(shù),如果包含,則意味著當(dāng)前域名機(jī)器子域名均開啟HSTS保護(hù)
- preload 可選參數(shù),只有當(dāng)你申請將自己的域名加入到瀏覽器內(nèi)置列表的時(shí)候才需要使用到它
讓瀏覽器直接發(fā)送HTTPS請求
只需要在響應(yīng)頭中加入
Strict-Transport-Security: max-age=31536000; includeSubDomains
就可以告訴瀏覽器該域名或子域名在接下來的一年內(nèi),對其應(yīng)強(qiáng)制性使用HTTPS
那么如果有效期過了怎么辦? 其實(shí)HSTS Header存在于每個(gè)響應(yīng)之中,隨著用戶和網(wǎng)站的交互,這個(gè)有效時(shí)間時(shí)刻都在刷新,再加上有效期通常被設(shè)置為1年,所以只要兩次請求間隔小于一年,基本上不會(huì)出現(xiàn)風(fēng)險(xiǎn)。
3. 攻擊者依然有機(jī)可乘
但是還有個(gè)問題,HSTS Header存在于響應(yīng)頭中,要拿到響應(yīng)頭還是得發(fā)送一次HTTP請求,在第一次訪問網(wǎng)站的時(shí)候,這時(shí)候中間人依然可以將這個(gè)HTTP請求劫持下來,繼續(xù)中間人攻擊。
4. 防御到底
針對上面的情況,HSTS也作出了應(yīng)對, 在瀏覽器中內(nèi)置一個(gè)列表,只要是在這個(gè)列表里的域名,無論何時(shí)、何種情況,瀏覽器都只使用HTTPS發(fā)起連接,這個(gè)列表由Google Chromium維護(hù),主流的瀏覽器都在使用