每個網站都應發送的安全標頭
您已經鎖定了伺服器、修補了框架,並對團隊進行了安全編碼培訓。但如果您的網站沒有發送正確的 HTTP 安全標頭,它仍然容易受到攻擊。這些回應標頭告訴瀏覽器在處理您的內容時應如何行為,而缺失或配置錯誤的標頭會為跨站腳本攻擊(XSS)、點擊劫持、協定降級攻擊和資料洩露敞開大門。
在本指南中,我們將介紹每個網站都應發送的必要安全標頭,解釋每個標頭的作用,並向您展示如何正確配置它們。
為什麼安全標頭很重要
安全標頭是第一道防線,因為它們強制執行您控制的瀏覽器層級策略。它們不能取代輸入驗證或安全身份驗證,但能顯著減少攻擊面。例如,嚴格的 Content-Security-Policy 可以阻止注入的腳本執行,即使攻擊者發現了 XSS 漏洞。
主流瀏覽器一致支援這些標頭,添加它們通常只需幾行配置。沒有理由不使用它們。
必要的安全標頭
以下是每個生產網站都應發送的標頭。我們將涵蓋它們的作用、建議值和常見陷阱。
1. Content-Security-Policy (CSP)
CSP 是緩解 XSS 和資料注入最強大的標頭。它限制瀏覽器可以從哪些來源載入腳本、樣式、圖片和其他資源。一個好的起始策略可能如下所示:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://images.example.com; object-src 'none'; base-uri 'self'; form-action 'self';從 default-src 'self' 開始,並根據需要逐步添加例外。如果可能,避免對腳本使用 'unsafe-inline';改用 nonce 或 hash。徹底測試,因為配置錯誤的 CSP 可能會破壞您的網站。
2. HTTP Strict Transport Security (HSTS)
HSTS 強制瀏覽器對您域名的所有未來請求使用 HTTPS。它防止協定降級攻擊和 cookie 劫持。一個典型的標頭:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preloadmax-age 以秒為單位(一年)。includeSubDomains 將策略應用於所有子域名。preload 允許您的域名被添加到瀏覽器預載入列表,但只有在您絕對確定所有子域名都支援 HTTPS 時才使用它。
3. X-Frame-Options
此標頭防止您的網站被嵌入 iframe,從而阻止點擊劫持攻擊。使用:
X-Frame-Options: DENY或者如果您需要框架自己的內容,使用 SAMEORIGIN。現代瀏覽器還支援 CSP 中的 frame-ancestors 指令,這更靈活。如果您使用 CSP,可以省略 X-Frame-Options,但同時包含兩者可以提供更好的相容性。
4. X-Content-Type-Options
此標頭阻止瀏覽器對回應進行 MIME 嗅探,偏離宣告的 Content-Type。它簡單有效:
X-Content-Type-Options: nosniff沒有它,惡意檔案可能被解釋為可執行腳本。始終設置它。
5. Referrer-Policy
Referrer-Policy 控制隨請求發送多少 referrer 資訊。一個平衡的預設值:
Referrer-Policy: strict-origin-when-cross-origin這會為同源請求發送完整 URL,而為跨源請求僅發送來源。它減少了敏感路徑資訊的洩露,同時保留了分析數據。
6. Permissions-Policy
以前稱為 Feature-Policy,此標頭允許您啟用或停用瀏覽器功能,如地理位置、相機和麥克風。範例:
Permissions-Policy: geolocation=(), camera=(), microphone=()停用未使用的功能可以減少受損第三方腳本的影響。
安全標頭比較
| 標頭 | 目的 | 建議值 |
|---|---|---|
| Content-Security-Policy | 緩解 XSS 和資料注入 | default-src 'self'; script-src 'self' ... |
| Strict-Transport-Security | 強制 HTTPS | max-age=31536000; includeSubDomains |
| X-Frame-Options | 防止點擊劫持 | DENY 或 SAMEORIGIN |
| X-Content-Type-Options | 停止 MIME 嗅探 | nosniff |
| Referrer-Policy | 控制 referrer 洩露 | strict-origin-when-cross-origin |
| Permissions-Policy | 限制瀏覽器功能 | geolocation=(), camera=() |
如何添加安全標頭
方法取決於您的網頁伺服器或框架。以下是一些常見方法。
Nginx
在您的 server 區塊中添加標頭:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://images.example.com; object-src 'none'; base-uri 'self'; form-action 'self';" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;always 參數確保即使錯誤回應也發送標頭。
Apache
啟用 mod_headers 並添加:
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://images.example.com; object-src 'none'; base-uri 'self'; form-action 'self';"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), camera=(), microphone=()"Node.js (Express)
使用 helmet 中介軟體,它預設設置許多標頭:
const helmet = require('helmet');
app.use(helmet());
// Customize CSP if needed
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "https://trusted.cdn.com"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:", "https://images.example.com"],
objectSrc: ["'none'"],
baseUri: ["'self'"],
formAction: ["'self'"],
}
}));Helmet 還預設設置其他標頭,如 X-Content-Type-Options 和 Referrer-Policy。
測試您的標頭
部署後,使用瀏覽器開發者工具(Network 標籤)或線上掃描器如 SecurityHeaders.com 驗證您的標頭。檢查:
- 所有建議的標頭都存在。
- CSP 沒有阻止合法資源(檢查控制台是否有違規)。
- HSTS 僅在 HTTPS 完全正常運作時啟用。
- 標頭在錯誤頁面上也發送。
隨著網站發展,定期審查和更新您的策略。
常見問題
最重要的安全標頭是什麼?
Content-Security-Policy 通常被認為是最重要的,因為它直接緩解 XSS 和資料注入攻擊,這些是最常見的網頁漏洞之一。
安全標頭可以取代其他安全措施嗎?
不能。安全標頭是縱深防禦的一層。您仍然需要安全編碼、輸入驗證、身份驗證和其他最佳實踐。
添加安全標頭會破壞我的網站嗎?
如果配置錯誤,尤其是 CSP,它們可能會阻止合法資源。始終在 staging 環境中測試,並在部署到生產環境前監控瀏覽器控制台是否有違規。
準備好鎖定您的網站了嗎?從添加上面的標頭開始,然後使用瀏覽器的開發者工具進行測試。如需快速檢查和格式化來自安全掃描器的 JSON 回應,請試試我們的 JSON Formatter。