筆者先寫跟 HTTP Header 相關的設定,往後也會談談如何部署 OpenResty + Lua 去做 WAF。

不知道您是否注意過 HTTP Header 中的資訊代表著什麼呢? 筆者以下介紹幾種跟安全性相關的 Header。

不過在介紹第一個 Header 之前,我們要先認識什麼是同源政策 (Same-origin policy)。

什麼是同源政策? (Same-origin policy)

舉例來說,網址是 http://store.example.com/dir/index.html,那下列哪些網址是同源,那些是非同源呢?

網址結果
http://store.example.com/dir/sub/another.html同源
http://store.example.com/dir2/other.html同源
https://store.example.com/secure.html協定不同
http://store.example.com:8080/dir/etc.htmlPort 不同
http://news.example.com/dir/other.htmlHost 不同

X-Frame-Options

用於禁止以 <iframe><frame> 的方式嵌入網頁。

  • DENY 禁止任何頁面嵌入至 frame 中,即使是自家網站也不例外
  • SAMEORIGIN 僅當符合同源政策 (Same-origin policy) 時,才能被嵌入到 frame 中
  • ALLOW-FROM uri 僅被允許的 URL 才可嵌入

如果其他網站沒有嵌入此網站頁面的需求,可以選擇 SAMEORIGIN,防止他人任意嵌入您網站的頁面。

X-Content-Type-Options

這個 Header 最先由微軟在 IE 8 中引進,如果資源的 Content-Type 未被指定,瀏覽器會做 MIME Sniffing 去猜測 MIME Type。例如,攻擊者可以將圖片「加料」,本來應該被解析成圖片的 Request 被解析成 JavaScript。

  • nosniff 即是告訴瀏覽器不用幫我們猜 MIME Type

X-XSS-Protection

當瀏覽器檢測到有 XSS 攻擊的情況時,會做出特定動作。根據 MDN 的說法,對現代的瀏覽器而言,其實這個 Header 已經不太重要了,但總是聊勝於無嘛。

  • 0 停用 XSS 過濾
  • 1 啟用 XSS 過濾 (大部分瀏覽器的預設值),當偵測到問題時,瀏覽器會將不安全的部分移除。
  • 1; mode=block 啟用 XSS 過濾,連移除都不用了,直接停止 Render 頁面

Render 在一些參考資料中通常翻譯為「渲染」,但其實稱為「轉譯」應更為貼切,故筆者還是習慣以英文稱之。

建議設定值

server
{
  add_header X-Frame-Options SAMEORIGIN;
  add_header X-Content-Type-Options nosniff;
  add_header X-XSS-Protection "1; mode=block";
}

參考資料

MDN | HTTP Headers Security