每個網站都應發送的安全標頭

Security2026-09-19TryQuickToolBox

您已經鎖定了伺服器、修補了框架,並對團隊進行了安全編碼培訓。但如果您的網站沒有發送正確的 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; preload

max-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強制 HTTPSmax-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 驗證您的標頭。檢查:

隨著網站發展,定期審查和更新您的策略。

常見問題

最重要的安全標頭是什麼?

Content-Security-Policy 通常被認為是最重要的,因為它直接緩解 XSS 和資料注入攻擊,這些是最常見的網頁漏洞之一。

安全標頭可以取代其他安全措施嗎?

不能。安全標頭是縱深防禦的一層。您仍然需要安全編碼、輸入驗證、身份驗證和其他最佳實踐。

添加安全標頭會破壞我的網站嗎?

如果配置錯誤,尤其是 CSP,它們可能會阻止合法資源。始終在 staging 環境中測試,並在部署到生產環境前監控瀏覽器控制台是否有違規。

準備好鎖定您的網站了嗎?從添加上面的標頭開始,然後使用瀏覽器的開發者工具進行測試。如需快速檢查和格式化來自安全掃描器的 JSON 回應,請試試我們的 JSON Formatter。