(Security) 使用HTTP Header來保護你的網站吧 !

本篇同步發佈在 Medium 平台上 Medium 連結


在 HTTP 通訊協定的內容中, Request 和 Response 有標準化內容格式,並且都包含了 Header 和 Body。在簡單了解 Header 和 Body 後,將介紹幾個可以用來保護你網站的 HTTP Header!


  • 大部分會包含:

    1. URL

    2. Http Request Method 請求方法 (Get、Post、DELETE、PUT…等)

    3. Http Status Code 狀態碼 (1xx :稍等、2xx:成功、3xx:重新導向、4xx:Client 端錯誤、5xx:Service 端錯誤)

  • 其他額外資訊也會放在這裡,例如:Client-ID、User-Agent、Authorization …等。

Body

  • 主要傳遞的訊息內容,其格式可能為 JSON、XML…等,但也可能是沒有內容的。

X-Frame-Options

X-Frame-Options 可以用來避免駭客在某個惡意網站當中,使用 iframe 嵌入你的網站,進而做到 Clickjacking 攻擊。

Clickjacking 是什麼呢?顧名思義就是攔截你的點擊來做壞事。簡單來說就是掛羊頭買狗肉,網站的樣貌是一個心理測驗網站,但是當你點擊網站內的開始測驗按鈕時,其實是到駭客的粉絲頁按讚。

以下為 X-Frame-Options 的各種設定:

  • DENY— 禁止任何人嵌入這頁網頁

  • SAMEORIGIN — 如果你想要寬鬆一點就可以使用 same origin ,那麼就會依據 DOM 的同源政策來判斷要嵌入你這頁的網站是否與你的網站同源

  • ALLOW-FROM https://某個網站.com/— 設定白名單,只允許某網站嵌入你的網頁

X-XSS-Protection

設定為:X-Xss-Protection: 1; mode=block

這個欄位的值設定為 1,它的模式設定為 block,便能讓瀏覽器預設的 XSS 防護生效。

X-Content-Type-Options

設定為:X-Content-Type-Options: nosniff

X-Content-Type-Options 設定為 nosniff (不要探測的意思),來避免 MIME sniffing 攻擊。

什麼是 MIME sniffing 攻擊呢?

MIME 的全名是 Multipurpose Internet Mail Extensions,最初是用於電子郵件方面,後來被 HTTP 採用,用來描述資源的類型,例如:圖片、影片、HTML 檔案…等。

假設駭客在部落格上寫一篇美食文章,並且上傳一張假的圖片,而這張假的圖片雖然被命名為 .jpg 但實際上是 HTML 程式碼,裡面含有一些惡意的攻擊程式,當另一位使用者看到駭客這篇美食文章,便會到 Server 端下載這張 .jpg,到那位使用者的瀏覽器作呈現,那麼攻擊的時間點就發生在瀏覽器試圖探測這個檔案的類型,瀏覽器會發現這個檔案其實不是圖片,它是 HTML 程式碼,瀏覽器一旦發現它其實是 HTML 程式碼時,瀏覽器就會對這個 .jpg 以 HTML 的方式去執行,因此內涵的惡意程式碼就會在使用者的瀏覽器執行並造成攻擊。

駭客就是利用瀏覽器會探測檔案資料類型的這個特性來達到他攻擊的目的。

Access-Control-Allow-Origin

根據 Same Origin Policy,只有相同來源的資源才可以相互存取,但現今網站功能愈來愈複雜,有時需要允許跨來源資源的存取。此時,便要好好設定 Access-Control-Allow-Origin。

設定為:

1.Access-Control-Allow-Origin:https://demo.com

你可以設定網站的網址,允許它來存取。

2.Access-Control-Allow-Credentials: true

也可以允許它是不是能夠帶相對應的 Cookie 來到你的網站,如果允許的話就把 Credentials 設定為 true。

3.Access-Control-Allow-Methods: GET

也可以設定存取你的網站時,使用的 HTTP Request 是哪一個動詞,這邊的範例是 GET。

HTTPS Strict Transport Security

確保你的網站都在安全的 HTTPS 下進行操作.這個設定會通知瀏覽器,此網站禁止使用 HTTP 方式載入,瀏覽器應該要把所有使用 HTTP 的請求全部替換成 HTTPS 請求。

以下為一個設定的範例:

Strict-Transport-Security: max-age=31536000; includeSubDomains

它可以設定一個有效期限,在這個有效期限之內你所有網站的 HTTP 請求,都會使用 HTTPS 來進行;

此外如果你的子網域也要套用這個設定,那就可以加上 includeSubDomains,就是包含子網域的意思。


HttpOnly

設定了 HttpOnly 的 Cookie 無法被客戶端的 JavaScript 程式碼存取,避免潛在的安全問題。

Secure

設定了 Secure 的 Cookie 只能在使用 HTTPS 的情況下被傳輸。


額外補充

Chrome 90 網址列將預設使用 https:// 了

當 Chrome 預設使用 HTTPS 協定,對於支援 HTTPS 的網站,便可直接連接到 HTTPS 端點,而不需要從 http:// 重新導向到 https://;

至於尚未支援 HTTPS 的網站,在 HTTPS 嘗試失敗後,包括名稱不符或是 DNS 解析失敗等連接錯誤,Chrome 便會回退使用 HTTP。

此調整除了明顯改善安全性和隱私性之外,這個更改也能提高支援 HTTPS 網站的初始載入速度。

comments powered by Disqus