一些安全相關(guān)的HTTP響應(yīng)頭
現(xiàn)代瀏覽器提供了一些安全相關(guān)的響應(yīng)頭,使用這些響應(yīng)頭一般只需要修改服務(wù)器配置即可,不需要修改程序代碼,成本很低。本文介紹一些這樣的響應(yīng)頭:
1. Strict-Transport-Security
HTTP Strict Transport Security,簡稱為HSTS。它允許一個HTTPS網(wǎng)站,要求瀏覽器總是通過HTTPS來訪問它?,F(xiàn)階段,除了Chrome瀏覽器,F(xiàn)irefox4+,以及Firefox的NoScript擴展都支持這個響應(yīng)頭。
我們知道HTTPS相對于HTTP有更好的安全性,而很多HTTPS網(wǎng)站,也可以通過HTTP來訪問。開發(fā)人員的失誤或者用戶主動輸入地址,都有可能導(dǎo)致用戶以HTTP訪問網(wǎng)站,降低了安全性。一般,我們會通過Web Server發(fā)送301/302重定向來解決這個問題?,F(xiàn)在有了HSTS,可以讓瀏覽器幫你做這個跳轉(zhuǎn),省一次HTTP請求。另外,瀏覽器本地替換可以保證只會發(fā)送HTTPS請求,避免被劫持。
要使用HSTS,只需要在你的HTTPS網(wǎng)站響應(yīng)頭中,加入下面這行:
strict-transport-security: max-age=16070400; includeSubDomains
includeSubDomains是可選的,用來指定是否作用于子域名。支持HSTS的瀏覽器遇到這個響應(yīng)頭,會把當(dāng)前網(wǎng)站加入HSTS列表,然后在max-age指定的秒數(shù)內(nèi),當(dāng)前網(wǎng)站所有請求都會被重定向為https。即使用戶主動輸入http://或者不輸入?yún)f(xié)議部分,都將重定向到https://地址。
Chrome內(nèi)置了一個HSTS列表,默認(rèn)包含Google、Paypal、Twitter、Linode等等服務(wù)。我們也可以在Chrome輸入chrome://net-internals/#hsts,進入HSTS管理界面。在這個頁面,你可以增加/刪除/查詢HSTS記錄。例如,你想一直以https訪問某網(wǎng)址,通過“add Domain”加上去就好了。
2. X-Frame-Options
X-Frame-Options,已經(jīng)轉(zhuǎn)正為Frame-Options,但現(xiàn)階段使用最好還是帶上X-。Chrome4+、Firefox3.6.9+、IE8+均支持,詳細(xì)的瀏覽器支持情況看這里。使用方式如下:
x-frame-options: SAMEORIGIN
這個響應(yīng)頭支持三種配置:
DENY:不允許被任何頁面嵌入;
SAMEORIGIN:不允許被本域以外的頁面嵌入;
ALLOW-FROM uri:不允許被指定的域名以外的頁面嵌入(Chrome現(xiàn)階段不支持);
如果某頁面被不被允許的頁面以<iframe>或<frame>的形式嵌入,IE會顯示類似于“此內(nèi)容無法在框架中顯示”的提示信息,Chrome和Firefox都會在控制臺打印信息。由于嵌入的頁面不會加載,這就減少了點擊劫持(Clickjacking)的發(fā)生。
3. X-XSS-Protection
顧名思義,這個響應(yīng)頭是用來防范XSS的。最早我是在介紹IE8的文章里看到這個,現(xiàn)在主流瀏覽器都支持,并且默認(rèn)都開啟了XSS保護,用這個header可以關(guān)閉它。它有幾種配置:
-
0:禁用XSS保護;
-
1:啟用XSS保護;
1; mode=block:啟用XSS保護,并在檢查到XSS攻擊時,停止渲染頁面(例如IE8中,檢查到攻擊時,整個頁面會被一個#替換);
瀏覽器提供的XSS保護機制并不完美,但是開啟后仍然可以提升攻擊難度,總之沒有特別的理由,不要關(guān)閉它。
4. X-Content-Type-Options
互聯(lián)網(wǎng)上的資源有各種類型,通常瀏覽器會根據(jù)響應(yīng)頭的Content-Type字段來分辨它們的類型。例如:"text/html"代表html文檔,"image/png"是PNG圖片,"text/css"是CSS樣式文檔。然而,有些資源的Content-Type是錯的或者未定義。這時,某些瀏覽器會啟用MIME-sniffing來猜測該資源的類型,解析內(nèi)容并執(zhí)行。
例如,我們即使給一個html文檔指定Content-Type為"text/plain",在IE8-中這個文檔依然會被當(dāng)做html來解析。利用瀏覽器的這個特性,攻擊者甚至可以讓原本應(yīng)該解析為圖片的請求被解析為JavaScript。通過下面這個響應(yīng)頭可以禁用瀏覽器的類型猜測行為:
X-Content-Type-Options: nosniff
這個響應(yīng)頭的值只能是nosniff,可用于IE8+和Chrome。
5. X-Content-Security-Policy
這個響應(yīng)頭主要是用來定義頁面可以加載哪些資源,減少XSS的發(fā)生。
別人怎么用
最后,我們來看看幾個實際案例:
Google+,使用了這幾個本文提到的響應(yīng)頭:
BASHx-content-type-options: nosniff x-frame-options: SAMEORIGIN x-xss-protection: 1; mode=block
Twitter使用了這些:
BASHstrict-transport-security: max-age=631138519 x-frame-options: SAMEORIGIN x-xss-protection: 1; mode=block
PayPal的:
X-Frame-Options: SAMEORIGIN Strict-Transport-Security: max-age=14400
Facebook則使用了這些(配置了詳細(xì)的CSP,關(guān)閉了XSS保護):
BASHstrict-transport-security: max-age=60 x-content-type-options: nosniff x-frame-options: DENY x-xss-protection: 0 content-security-policy: default-src *;script-src https://*.facebook.com http://*.facebook.com https://*.fbcdn.net http://*.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl 'unsafe-inline' 'unsafe-eval' https://*.akamaihd.net http://*.akamaihd.net;style-src * 'unsafe-inline';connect-src https://*.facebook.com http://*.facebook.com https://*.fbcdn.net http://*.fbcdn.net *.facebook.net *.spotilocal.com:* https://*.akamaihd.net ws://*.facebook.com:* http://*.akamaihd.net https://fb.scanandcleanlocal.com:*;