HTTP header 安全設定

總覽

根據DEVCORE,相關HTTP header可以如下分類

  • 防禦 XSS:
    • Content-Security-Policy
    • Set-Cookie: HttpOnly
    • X-XSS-Protection
    • X-Download-Options
  • 防禦 Clickjacking:
    • X-Frame-Options
  • 強化 HTTPS 機制:
    • Set-Cookie: Secure
    • Strict-Transport-Security
  • 避免瀏覽器誤判文件形態:
    • X-Content-Type-Options
  • 保護網站資源別被任意存取:
    • Access-Control-Allow-Origin
    • X-Permitted-Cross-Domain-Policies

防禦 XSS

Content-Security-Policy

  • 原理:

    • 用來控制不要讀取外部不可信賴資源,可以防止XSS或injection
  • 啟動方式:

    1
    Content-Security-Policy: policy # policy代表描述你的CSP的策略
    • 範例
    1
    2
    3
    4
    5
    6
    # 所有內容都來自同一個地方
    Content-Security-Policy: default-src 'self'
    # 比較複雜的設定,不擋image來源,但是設定media和script的來源,注意後方設定會蓋掉default-src的設定
    Content-SecContent-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
    # 推薦設定:因為預設會擋html裡有js,style,但是大部分都會用到,所以要加上unsafe-inline
    Content-Security-Policy: default-src 'self' 'unsafe-inline'
  • 可參考

  • 原理:
    • http only確保javascript無法直接存取cookie。
  • 啟動方式:
    • 只要在Set-Cookie的header加上HttpOnly就可以生效了。

X-XSS-Protection

  • 原理:

    • 這是IE引進的功能,可以檢查XSS攻擊,不過firefox不支援。基本上CSP已經提供足夠防禦,但是可以讓不支援CSP舊版瀏覽器有比較高的安全性。
  • 啟動方式:

    1
    2
    3
    X-XSS-Protection: 0   # 禁止XSS過濾
    X-XSS-Protection: 1 # 允許XSS過濾,遇到XSS會清除頁面
    X-XSS-Protection: 1; mode=block # 允許XSS過濾,遇到XSS會阻擋頁面加載
  • 可參考:

X-Download-Options

  • 原理:

    • 在IE8加入了這個選項,防止使用者下載檔案的時候點選直接開啟,避免執行執行了程式而且沒有在下載管理員留下紀錄的問題。
  • 啟動方式:

    1
    X-Download-Options: noopen
  • 可參考

防禦 Clickjacking

X-Frame-Options

  • 原理:

    • 控制frame和iframe顯示頁面的規則,不讓別人可以內嵌頁面。
  • 啟動方式:

    • 在header加上X-Frame-Options: XXX,XXX可以是
      • DENY:禁止frame頁面
      • SAMEORIGIN:允許frame顯示同一網站頁面
      • ALLOW-FROM url:允許frame顯示某一網站頁面
    1
    X-Frame-Options: SAMEORIGIN

強化 HTTPS 機制

  • 原理:
    • 強制讓cookie必須要在https的情況下才能傳輸
  • 啟動方式:
    • 只要在Set-Cookie的header加上Secure就可以生效了。

Strict-Transport-Security

  • 原理:

    • 當使用者用http連線,強制轉成https連線,這個選項只有在https連線的情況下才有用,如果是http會被忽略(因為可能有MITM)
  • 啟動方式:

    1
    2
    3
    Strict-Transport-Security: max-age=expireTime [; includeSubdomains]
    # max-age=expireTime: browser要記住這個網站要用https連線的時間
    # includeSubdomains: 哪些subdomain也都要同樣設定
  • 可參考

避免瀏覽器誤判文件形態

X-Content-Type-Options

  • 原理:

    • 告訴client要遵守Content-Type的MIME設定,不要自行偵測,管理者必須要確保自己的設定是沒有錯誤的。
  • 啟動方式:

    1
    X-Content-Type-Options:nosniff
  • 可參考

保護網站資源別被任意存取

Access-Control-Allow-Origin

X-Permitted-Cross-Domain-Policies

參考