Security Headers:
網頁安全的隱形防線
為什麼加了幾個 Header 就能防禦 90% 的攻擊?從 CORS、CSP 到 HSTS,深度解析現代瀏覽器的安全機制與正確配置方法。
隱形防線:瀏覽器與伺服器的契約
「最好的安全防禦,是讓攻擊者連出手的機會都沒有。」
當你在瀏覽器輸入網址,伺服器回傳的不只有 HTML,還有一堆隱藏在背後的 HTTP Headers。 這些 Headers 就像是伺服器給瀏覽器的「行為準則」:哪些 Script 可以跑、哪些網站可以讀取資料、連線是否必須加密。
為什麼你需要 Security Headers?
1. 成本最低的防禦
不需要修改業務邏輯,只需要在伺服器設定(Nginx/Next.js)加幾行字。
2. 深度防禦 (Defense in Depth)
即便你的程式碼有 XSS 漏洞,正確的 CSP 也能阻止駭客執行惡意腳本。
一、CORS:不是用來阻擋駭客的
CORS (Cross-Origin Resource Sharing) 大概是前端工程師最討厭的錯誤。 但請記住一個核心概念:CORS 是一種放寬限制的機制,而不是一種防護機制。
痛點:為什麼會有 CORS 錯誤?
瀏覽器預設遵守「同源政策 (Same-Origin Policy)」,不允許 Domain A 的網頁去讀取 Domain B 的 API 資料。 這是為了防止駭客在惡意網站寫一段 JS 去偷讀你在銀行網站的個人資訊。
駭客眼中的 CORS:
- 「如果我能把 Access-Control-Allow-Origin 設成 *,我就能從任何地方發請求。」
最佳實踐:如何正確設定 CORS
二、CSP:網頁安全的「白名單」
CSP (Content Security Policy) 是防禦 XSS (跨站腳本攻擊) 的大殺器。 它告訴瀏覽器:「只有這份名單上的來源可以執行 Script 或讀取圖片,其他的通通不准跑。」
沒有 CSP 的風險
駭客在評論區留下一段程式碼,瀏覽器會乖乖執行它,把使用者的 Cookie 傳到駭客伺服器。
有 CSP 的保護
瀏覽器看到該 Script 來源不在白名單內,直接報錯阻斷,駭客無功而返。
一個嚴謹的 CSP 範例:
⚠️ 小提醒:
如果要完全防止 XSS,應盡量避免使用'unsafe-inline', 改用 Nonce (一次性隨機字串) 或 Hash。三、HSTS:強制加密,杜絕中間人攻擊
你以為把網站轉址到 HTTPS 就安全了嗎?駭客可以利用「SSL Stripping」攻擊,在使用者發出第一個 HTTP 請求時就將其劫持。HSTS (HTTP Strict Transport Security) 告訴瀏覽器:「在接下來的一年內,這個網站的所有請求都必須直接走 HTTPS,連嘗試 HTTP 都不准。」
四、Cookie Security:保護使用者的憑證
Cookie 存載著 Session ID,是駭客最垂涎的目標。如果你沒有正確設定以下三個屬性,使用者的帳號就像沒鎖門一樣危險。
HttpOnly
防偷取禁止 JavaScript 存取 Cookie。
防止 XSS 攻擊者利用 document.cookie 偷走 Session ID。
Secure
防監聽強制 Cookie 只能在加密的 HTTPS 連線中傳輸。
防止在不安全的 Wi-Fi 環境下被中間人監聽抓到明文 Cookie。
SameSite
防偽造限制第三方網站是否能帶上這個 Cookie。
設為 "Strict" 或 "Lax" 是防禦 CSRF (跨站請求偽造) 的最佳利器。
五、那些「不用思考也該加」的 Headers
最後這兩個 Header 設定非常簡單,但能解決一些特定的瀏覽器漏洞。
X-Frame-Options
防止 Clickjacking (點擊劫持)。禁止別人的網站用 iframe 嵌入你的頁面,然後在上面覆蓋一層透明按鈕來騙取點擊。
X-Content-Type-Options
防止 MIME Sniffing。告訴瀏覽器:「不要猜測檔案類型,我說它是什麼就是什麼」,防止駭客偽裝成圖片的惡意 Script 被執行。
實戰懶人包:如何快速落地?
不用覺得頭大,如果你是使用 Next.js,你可以直接在 `next.config.js` 中一次性解決所有問題:
先在 Dev 環境測試
使用 SecurityHeaders.com 檢測
覺得這篇文章有幫助嗎?
在這個 Bootcamp 系列中,我們持續分享軟體開發的核心技術。如果有任何問題,歡迎在 LinkedIn 上與我交流!