一些安全相關的HTTP響應頭

imququ發表於2013-08-12

  現代瀏覽器提供了一些安全相關的響應頭,使用這些響應頭一般只需要修改伺服器配置即可,不需要修改程式程式碼,成本很低。本文介紹一些這樣的響應頭:

  1. Strict-Transport-Security

  HTTP Strict Transport Security,簡稱為HSTS。它允許一個HTTPS網站,要求瀏覽器總是通過HTTPS來訪問它。現階段,除了Chrome瀏覽器,Firefox4+,以及Firefox的NoScript擴充套件都支援這個響應頭。

  我們知道HTTPS相對於HTTP有更好的安全性,而很多HTTPS網站,也可以通過HTTP來訪問。開發人員的失誤或者使用者主動輸入地址,都有可能導致使用者以HTTP訪問網站,降低了安全性。一般,我們會通過Web Server傳送301/302重定向來解決這個問題。現在有了HSTS,可以讓瀏覽器幫你做這個跳轉,省一次HTTP請求。

  要使用HSTS,只需要在你的HTTPS網站響應頭中,加入下面這行:

strict-transport-security: max-age=16070400; includeSubDomains

  includeSubDomains是可選的,用來指定是否作用於子域名。支援HSTS的瀏覽器遇到這個響應頭,會把當前網站加入HSTS列表,然後在max-age指定的秒數內,當前網站所有請求都會被重定向為https。即使使用者主動輸入http://或者不輸入協議部分,都將重定向到https://地址。

  Chrome內建了一個HSTS列表,預設包含Google、Paypal、Twitter、Linode等等服務。我們也可以在Chrome輸入chrome://net-internals/#hsts,進入HSTS管理介面。在這個頁面,你可以增加/刪除/查詢HSTS記錄。例如,你想一直以https訪問某網址,通過“add Domain”加上去就好了。檢視Chrome內建的全部HSTS列表,或者想把自己的網站加入這個列表,請點這裡

  2. X-Frame-Options

  X-Frame-Options,已經轉正為Frame-Options,但現階段使用最好還是帶上X-。Chrome4+、Firefox3.6.9+、IE8+均支援,詳細的瀏覽器支援情況看這裡。使用方式如下:

x-frame-options: SAMEORIGIN

  這個響應頭支援三種配置:

  • DENY:不允許被任何頁面嵌入;
  • SAMEORIGIN:不允許被本域以外的頁面嵌入;
  • ALLOW-FROM uri:不允許被指定的域名以外的頁面嵌入(Chrome現階段不支援);

  如果某頁面被不被允許的頁面以<iframe>或<frame>的形式嵌入,IE會顯示類似於“此內容無法在框架中顯示”的提示資訊,Chrome和Firefox都會在控制檯列印資訊。由於嵌入的頁面不會載入,這就減少了點選劫持(Clickjacking)的發生。

  3. X-XSS-Protection

  顧名思義,這個響應頭是用來防範XSS的。最早我是在介紹IE8的文章裡看到這個,現在主流瀏覽器都支援,並且預設都開啟了XSS保護,用這個header可以關閉它。它有幾種配置:

  • 0:禁用XSS保護;
  • 1:啟用XSS保護;
  • 1; mode=block:啟用XSS保護,並在檢查到XSS攻擊時,停止渲染頁面(例如IE8中,檢查到攻擊時,整個頁面會被一個#替換);

  瀏覽器提供的XSS保護機制並不完美,但是開啟後仍然可以提升攻擊難度,總之沒有特別的理由,不要關閉它。

  4. X-Content-Type-Options

  網際網路上的資源有各種型別,通常瀏覽器會根據響應頭的Content-Type欄位來分辨它們的型別。例如:"text/html"代表html文件,"image/png"是PNG圖片,"text/css"是CSS樣式文件。然而,有些資源的Content-Type是錯的或者未定義。這時,某些瀏覽器會啟用MIME-sniffing來猜測該資源的型別,解析內容並執行。

  例如,我們即使給一個html文件指定Content-Type為"text/plain",在IE8-中這個文件依然會被當做html來解析。利用瀏覽器的這個特性,攻擊者甚至可以讓原本應該解析為圖片的請求被解析為JavaScript。通過下面這個響應頭可以禁用瀏覽器的型別猜測行為:

X-Content-Type-Options: nosniff

  這個響應頭的值只能是nosniff,可用於IE8+和Chrome。另外,它還被Chrome用於擴充套件下載,見這裡

  5. X-Content-Security-Policy

  這個響應頭主要是用來定義頁面可以載入哪些資源,減少XSS的發生。之前單獨介紹過,請點選繼續瀏覽:Content Security Policy介紹

  別人怎麼用

  最後,我們來看看幾個實際案例:

  Google+,使用了這幾個本文提到的響應頭:

x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block

  Twitter使用了這些:

strict-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則使用了這些(配置了詳細的CSP,關閉了XSS保護):

strict-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:*;

相關文章