Nginx Security Headers - 新增基本的 header 保護你的前端



前言

  • 在 [1] 這篇看到他用的 nginx security headers。於是也分別記錄一下。



說明

Security Headers in Nginx:

1
2
3
4
5
6
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "default-src 'self' www.google-analytics.com ajax.googleapis.com www.google.com google.com gstatic.com www.gstatic.com connect.facebook.net facebook.com;";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "origin";

分別解釋如下。


HSTS (Strict-Transport-Security)

  • 要求瀏覽器只能透過 HTTPS 連線,並且不允許使用不安全的連線。wiki [2]
  • 只要第一次透過 HTTPS 連線到這個網站,之後的連線都會強制使用 HTTPS,即使指定 http:// 也一樣。

X-Frame-Options: DENY

  • 讓瀏覽器不要渲染以下標籤裡面的 page: <frame>, <iframe>, <embed><object>
  • 這樣可以避免 click jacking (點擊劫持) 攻擊 [3] — 你以為點擊的是 A 功能,但實際上是做了 B 功能。

X-Content-Type-Options nosniff

  • 防止瀏覽器對 response 的 MIME type 進行猜測。

MIMIME type sniffing:是一種瀏覽器「用來確定文件實際 MIME 類型」的技術,且不管伺服器聲稱的 MIME 類型是什麼。

nosniff 代表瀏覽器必須採用伺服器聲稱的 MIME 類型;如果不這樣做,攻擊者可以利用這個漏洞來進行 MIME type confusion 攻擊 [4]。

例如,把有害的 HTML/JS 偽裝成一個圖片。


CSP (Content-Security-Policy)

  • 基本上就是條列 source 的白名單 [5],例如
    • default-src 'self':只允許自己的網站
    • script-src 'self' www.google-analytics.com:只允許自己的網站和 google analytics 的 JavaScript
    • img-src 'self' www.google.com:只允許自己的網站和 google

目前我自己開發的功能還沒分這麼複雜,所以學原作者,主要條列 default-src 就好。


X-XSS-Protection

X-XSS-Protection: 1; mode=block 的意思是

  • 1: 啟用 XSS filter
  • mode=block: 如果有 XSS 攻擊,就會停止渲染這個頁面。

不過這只能防止 reflected XSS attacks,無法處理 DOM-based XSS attacks。

另外是有一些討論 [6] 認為不要加上這個 header,單純用 CSP 利大於弊。


Note

  1. reflected XSS attacks (讓後端渲染惡意 HTML):

    1. 攻擊者製作一個修改過、帶有 <script> tag 的 URL (如同 injection 的做法)
    2. 攻擊者誘使 user (例如騙他點擊一個連結) 的瀏覽器發送這個 URL 給 server
    3. server (如果沒有仔細處理) 就會把這個 URL 的內容渲染後,回傳給 user
    4. user 收到後,就會執行這個 script
  2. DOM-based XSS attacks (純前端渲染惡意 HTML):

    1. 攻擊者製作一個修改過、帶有 <script> tag 的 URL (如同 injection 的做法)
    2. 如果前端存在漏洞,這個 URL 帶上的參數 (<script>xxx</script>) 會被當作 HTML 來渲染
    3. 攻擊者誘使 user (例如騙他點擊一個連結) 的瀏覽器處理這個 URL
    4. user 下載到的 HTML 中會帶上攻擊者的 script,並且執行

Referrer-Policy “origin”

在瀏覽器切換網站時,把 Header Referrer 設定為 origin,這樣就不會把完整的 URL 傳給下一個網站。

例如 Referrer 原本是

https://www.example.com/search?q=hello&token=123123123

如果有設定成 origin,就會變成

https://www.example.com

這樣另一個網站就無法「藉由 Referrer 的內容」,得知你的 query string 或是 token。




REF

  1. https://serverfault.com/questions/874936/adding-hsts-to-nginx-config
  2. https://zh.wikipedia.org/zh-tw/HTTP%E4%B8%A5%E6%A0%BC%E4%BC%A0%E8%BE%93%E5%AE%89%E5%85%A8
  3. https://ithelp.ithome.com.tw/articles/10329128
  4. https://www.compassitc.com/blog/mime-sniffing-what-is-it-what-are-the-security-implications
  5. https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
  6. https://security.stackexchange.com/questions/253924/is-it-better-to-disable-x-xss-protection-header-or-set-the-header-as-x-xss-prote

主題 StackJimmy 設計