進一步瞭解可保護網站安全的標頭,並快速查看最重要的詳細資料。
本文列出可用來保護網站的重要安全性標頭。您可以透過這份指南瞭解網頁式安全防護功能、如何在網站上實作這些功能,並在需要提醒時做為參考。
- 建議處理使用者機密資料的網站使用下列安全性標頭:
- 內容安全政策 (CSP)
- Trusted Types
- 建議所有網站使用的安全性標頭:
- X-Content-Type-Options
- X-Frame-Options
- 跨源資源政策 (CORP)
- 跨源開啟工具政策 (COOP)
- HTTP 嚴格傳輸安全性 (HSTS)
- 具備進階功能的網站安全性標頭:
- 跨源資源共享 (CORS)
- 跨源嵌入器政策 (COEP)
深入瞭解安全性標頭之前,請先瞭解網路上的已知威脅,以及使用這些安全性標頭的原因。
保護網站免受插入安全漏洞
如果應用程式處理的不信任資料會影響應用程式行為,通常會導致執行攻擊者控制的指令碼,進而產生插入安全漏洞。注入錯誤最常導致的安全漏洞是各種形式的跨網站指令碼攻擊 (XSS),包括反射型 XSS、儲存型 XSS、DOM 型 XSS 和其他變體。
XSS 安全漏洞通常會讓攻擊者能完整存取應用程式處理的使用者資料,以及相同網路來源託管的其他資訊。
傳統的插入防禦措施包括:一律使用自動逸出 HTML 範本系統、避免使用危險的 JavaScript API,以及在獨立網域中託管檔案上傳作業和清理使用者控制的 HTML,藉此妥善處理使用者資料。
- 使用內容安全政策 (CSP) 控制應用程式可執行的指令碼,降低插入風險。
- 使用可信任類型,強制清理傳入危險 JavaScript API 的資料。
- 使用 X-Content-Type-Options,防止瀏覽器誤解網站資源的 MIME 類型,導致指令碼執行。
將網站與其他網站隔離
網路的開放性讓網站能以可能違反應用程式安全性預期的方式彼此互動。包括在攻擊者的文件中,意外提出已驗證的要求或嵌入其他應用程式的資料,讓攻擊者修改或讀取應用程式資料。
破壞網頁隔離的常見安全漏洞包括點擊劫持、跨網站偽造要求 (CSRF)、跨網站指令碼置入 (XSSI),以及各種跨網站洩漏。
- 使用 X-Frame-Options,防止惡意網站嵌入您的文件。
- 使用跨源資源政策 (CORP),防止網站資源遭到跨源網站納入。
- 使用跨源開啟者政策 (COOP),保護網站視窗不受惡意網站互動影響。
- 使用跨源資源共享 (CORS),控制跨源文件對網站資源的存取權。
如果您對這些標頭感興趣,建議您閱讀幽靈漏洞後的網頁開發。
安全地建構強大的網站
Spectre 會將載入相同瀏覽情境群組的任何資料設為可讀取,即使同源政策也是如此。瀏覽器會限制可能在名為「跨來源隔離」的特殊環境中利用漏洞的功能。透過跨來源隔離,您可以使用 SharedArrayBuffer 等強大功能。
- 使用跨源嵌入程式政策 (COEP) 和 COOP 啟用跨源隔離。
加密網站流量
如果應用程式未完整加密傳輸中的資料,就會出現加密問題,導致竊聽攻擊者得知使用者與應用程式的互動情形。
加密不足的情況可能發生在下列情況:未使用 HTTPS、混合內容、設定 Cookie 時未加上 Secure 屬性 (或 __Secure 前置字元),或寬鬆的 CORS 驗證邏輯。
- 使用 HTTP 嚴格傳輸安全性 (HSTS),一律透過 HTTPS 提供內容。
內容安全政策 (CSP)
跨網站指令碼攻擊 (XSS) 是指攻擊者利用網站的安全漏洞,插入並執行惡意指令碼。
Content-Security-Policy 限制網頁可執行的指令碼,進一步防範 XSS 攻擊。
建議您採用下列其中一種方法啟用嚴格 CSP:
- 如果您在伺服器上算繪 HTML 網頁,請使用以 Nonce 為基礎的嚴格 CSP。
- 如果 HTML 必須以靜態方式提供或快取 (例如單頁應用程式),請使用雜湊式嚴格 CSP。
使用範例:以 Nonce 為基礎的 CSP
Content-Security-Policy:
script-src 'nonce-{RANDOM1}' 'strict-dynamic' https: 'unsafe-inline';
object-src 'none';
base-uri 'none';
建議用途
1. 使用以 Nonce 為基礎的嚴格 CSP {: #nonce-based-csp}
如果您在伺服器上算繪 HTML 網頁,請使用以 Nonce 為基礎的嚴格 CSP。
為伺服器端的每個要求產生新的指令碼 Nonce 值,並設定下列標頭:
伺服器設定檔
Content-Security-Policy: script-src 'nonce-{RANDOM1}' 'strict-dynamic' https: 'unsafe-inline'; object-src 'none'; base-uri 'none';
在 HTML 中,如要載入指令碼,請將所有 <script> 標記的 nonce 屬性設為相同的 {RANDOM1} 字串。
index.html
<script nonce="{RANDOM1}" src="https://example.com/script1.js"></script>
<script nonce="{RANDOM1}">
// Inline scripts can be used with the <code>nonce</code> attribute.
</script>Google 相簿是以 Nonce 為基礎的嚴格 CSP 範例。使用開發人員工具查看使用方式。
2. 使用雜湊式嚴格 CSP {: #hash-based-csp}
如果 HTML 必須以靜態方式提供或快取 (例如建構單頁應用程式),請使用雜湊式嚴格 CSP。
伺服器設定檔
Content-Security-Policy: script-src 'sha256-{HASH1}' 'sha256-{HASH2}' 'strict-dynamic' https: 'unsafe-inline'; object-src 'none'; base-uri 'none';
在 HTML 中,您必須內嵌指令碼,才能套用雜湊政策,因為大多數瀏覽器不支援雜湊外部指令碼。
index.html
<script> ...// your script1, inlined </script> <script> ...// your script2, inlined </script>
如要載入外部指令碼,請參閱「選項 B:雜湊式 CSP 回應標頭」一節中的「動態載入來源指令碼」。
CSP Evaluator 是評估 CSP 的好工具,同時也是以 Nonce 為基礎的嚴格 CSP 範例。使用開發人員工具查看使用方式。
支援的瀏覽器
CSP 的其他注意事項
frame-ancestors指令可保護網站免受點擊劫持攻擊,如果允許不受信任的網站嵌入您的網站,就會產生這種風險。如果偏好較簡單的解決方案,可以使用X-Frame-Options封鎖載入,但frame-ancestors提供進階設定,可僅允許特定來源做為嵌入器。- 您可能已使用內容安全政策,確保網站的所有資源都透過 HTTPS 載入。這項功能現在已較不實用:目前大多數瀏覽器都會封鎖混合內容。
- 您也可以在僅限報表模式中設定 CSP。
- 如果無法在伺服器端將 CSP 設為標頭,也可以將其設為中繼標記。請注意,您無法對中繼標記使用僅限報表模式 (不過這點可能會改變)。
瞭解詳情
Trusted Types
DOM 型 XSS 是一種攻擊,會將惡意資料傳遞至支援動態程式碼執行的接收器,例如 eval() 或 .innerHTML。
Trusted Types 提供工具,可編寫、安全審查及維護不含 DOM XSS 的應用程式。您可以透過 CSP 啟用這項功能,並限制危險的 Web API 只能接受特殊物件 (即 Trusted Type),讓 JavaScript 程式碼預設採用安全設定。
如要建立這些物件,您可以定義安全性政策,確保在將資料寫入 DOM 之前,一律套用安全性規則 (例如逸出或清理)。這樣一來,這些政策就是程式碼中唯一可能引入 DOM XSS 的地方。
使用範例
Content-Security-Policy: require-trusted-types-for 'script'
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => {
return str.replace(/\</g, '<').replace(/>/g, '>');
}
});
}
// Assignment of raw strings is blocked by Trusted Types.
el.innerHTML = 'some string'; // This throws an exception.
// Assignment of Trusted Types is accepted safely.
const escaped = policy.createHTML('<img src=x onerror=alert(1)>');
el.innerHTML = escaped; // '&lt;img src=x onerror=alert(1)&gt;'
建議用途
-
針對危險的 DOM 接收器強制執行 Trusted Types CSP 和 Trusted Types 標頭:
Content-Security-Policy: require-trusted-types-for 'script'目前
'script'是require-trusted-types-for指令唯一可接受的值。當然,您可以將 Trusted Types 與其他 CSP 指令結合:
將上述以 Nonce 為基礎的 CSP 與 Trusted Types 合併:
Content-Security-Policy:
script-src 'nonce-{RANDOM1}' 'strict-dynamic' https: 'unsafe-inline';
object-src 'none';
base-uri 'none';
require-trusted-types-for 'script';
<aside class="note"><b>注意:</b>您可以設定額外的 <code>trusted-types</code> 指令 (例如 <code>trusted-types myPolicy</code>),限制允許的 Trusted Types 政策名稱。不過,這並非必要。</aside>
-
定義政策
政策:
// Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { // Name and create a policy const policy = trustedTypes.createPolicy('escapePolicy', { createHTML: str => { return str.replace(/\/g, '>'); } }); }
-
套用政策
將資料寫入 DOM 時使用政策:
// Assignment of raw strings are blocked by Trusted Types. el.innerHTML = 'some string'; // This throws an exception.</p> <p>// Assignment of Trusted Types is accepted safely. const escaped = policy.createHTML('<img src="x" onerror="alert(1)">'); el.innerHTML = escaped; // '<img src=x onerror=alert(1)>'
使用
require-trusted-types-for 'script'時,必須使用信任的類型。如果將任何危險的 DOM API 與字串搭配使用,就會發生錯誤。
支援的瀏覽器
瞭解詳情
X-Content-Type-Options
如果您的網域提供惡意 HTML 文件 (例如上傳至相片服務的圖片含有有效的 HTML 標記),部分瀏覽器會將其視為有效文件,並允許在應用程式的內容中執行指令碼,導致跨網站指令碼攻擊。
X-Content-Type-Options: nosniff 會指示瀏覽器,特定回應的 Content-Type 標頭中設定的 MIME 類型正確無誤,藉此防止這種情況發生。建議您為所有資源設定這個標頭。
使用範例
X-Content-Type-Options: nosniff
建議用途
建議您對伺服器提供的所有資源使用 X-Content-Type-Options: nosniff,並搭配正確的 Content-Type 標頭。
與文件 HTML 一併傳送的標頭範例
X-Content-Type-Options: nosniff Content-Type: text/html; charset=utf-8
支援的瀏覽器
瞭解詳情
X-Frame-Options
如果惡意網站可以將您的網站嵌入為 iframe,攻擊者可能會透過點擊劫持,叫用使用者非預期的動作。此外,在某些情況下,Spectre 類型的攻擊會讓惡意網站有機會瞭解嵌入文件的內容。
X-Frame-Options 指出是否應允許瀏覽器在 <frame>、<iframe>、<embed> 或 <object> 中算繪網頁。建議所有文件都傳送這個標頭,指出是否允許其他文件嵌入。
使用範例
X-Frame-Options: DENY
建議用途
所有不適合內嵌的文件都應使用 X-Frame-Options 標頭。
防止網站遭其他網站嵌入
拒絕由任何其他文件嵌入。
X-Frame-Options: DENY防止網站遭任何跨源網站嵌入
僅允許同源文件嵌入。
X-Frame-Options: SAMEORIGIN支援的瀏覽器
瞭解詳情
跨源資源政策 (CORP)
攻擊者可以嵌入其他來源 (例如您的網站) 的資源,利用網頁式跨網站外洩瞭解這些資源的相關資訊。
Cross-Origin-Resource-Policy 會指出可載入該指令碼的網站組合,降低這類風險。標頭會採用下列三個值之一:same-origin、same-site 和 cross-origin。建議所有資源都傳送這個標頭,指出是否允許其他網站載入。
使用範例
Cross-Origin-Resource-Policy: same-origin
建議用途
建議所有資源都使用下列三個標頭之一。
允許載入資源cross-origin
建議類似 CDN 的服務將 cross-origin 套用至資源 (因為這些資源通常是由跨來源網頁載入),除非這些資源已透過具有類似效果的 CORS 提供。
Cross-Origin-Resource-Policy: cross-origin限制從 same-origin 載入的資源
same-origin 應套用至僅由同源網頁載入的資源。如果資源包含使用者的私密資訊,或 API 回應只能從相同來源呼叫,請務必套用這項設定。
請注意,含有這個標頭的資源仍可直接載入,例如在新瀏覽器視窗中前往網址。跨源資源政策只能防止資源遭其他網站嵌入。
Cross-Origin-Resource-Policy: same-origin限制從 same-site 載入的資源
如果資源與上述類似,但要由網站的其他子網域載入,建議套用 same-site。
Cross-Origin-Resource-Policy: same-site支援的瀏覽器
瞭解詳情
跨源開啟者政策 (COOP)
攻擊者的網站可以利用網頁式跨網站資訊洩漏,在彈出式視窗中開啟另一個網站,藉此取得相關資訊。在某些情況下,這也可能導致系統遭到基於 Spectre 的旁路攻擊。
Cross-Origin-Opener-Policy 標頭可讓文件與透過 window.open() 開啟的跨來源視窗,或不含 rel="noopener" 的 target="_blank" 連結隔離。因此,文件的任何跨來源開啟工具都不會參照該文件,也無法與其互動。
使用範例
Cross-Origin-Opener-Policy: same-origin-allow-popups
建議用途
將文件與跨來源視窗隔離
設定 same-origin 會將文件與跨源文件視窗隔離。
Cross-Origin-Opener-Policy: same-origin將文件與跨來源視窗隔離,但允許彈出式視窗
設定 same-origin-allow-popups 可讓文件保留彈出式視窗的參照,除非彈出式視窗使用 same-origin 或 same-origin-allow-popups 設定 COOP。這表示 same-origin-allow-popups 仍可防止文件在以彈出式視窗開啟時遭到參照,但允許文件與自己的彈出式視窗通訊。
Cross-Origin-Opener-Policy: same-origin-allow-popups允許跨源視窗參照文件
unsafe-none 是預設值,但您可以明確指出這份文件可由跨源視窗開啟,並保留相互存取權。
Cross-Origin-Opener-Policy: unsafe-none回報與 COOP 不相容的模式
當 COOP 透過 Reporting API 阻止跨視窗互動時,您會收到報告。
Cross-Origin-Opener-Policy: same-origin; report-to="coop"COOP 也支援僅限報表模式,因此您可以在不實際封鎖跨來源文件之間通訊的情況下,接收報表。
Cross-Origin-Opener-Policy-Report-Only: same-origin; report-to="coop"支援的瀏覽器
瞭解詳情
跨源資源共享 (CORS)
與本文中的其他項目不同,跨源資源共享 (CORS) 不是標頭,而是一種瀏覽器機制,用於要求及允許存取跨源資源。
根據預設,瀏覽器會強制執行同源政策,防止網頁存取跨源資源。舉例來說,載入跨源圖片時,即使圖片在網頁上顯示,網頁上的 JavaScript 也無法存取圖片資料。資源供應商可以放寬限制,並透過選擇加入 CORS 允許其他網站讀取資源。
使用範例
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
在瞭解如何設定 CORS 之前,建議您先瞭解要求類型之間的差異。系統會根據要求詳細資料,將要求分類為「簡單要求」或「預檢要求」。
簡單要求的條件:
- 方法為
GET、HEAD或POST。 - 自訂標頭僅包含
Accept、Accept-Language、Content-Language和Content-Type。 Content-Type為application/x-www-form-urlencoded、multipart/form-data或text/plain。
其他所有要求都會歸類為預檢要求。詳情請參閱「跨源資源共享 (CORS) - HTTP | MDN」。
建議用途
簡單要求
如果要求符合簡單要求條件,瀏覽器會傳送跨源要求,並附上 Origin 標頭,指出要求來源。
要求標頭範例
Get / HTTP/1.1 Origin: https://example.com
回應標頭範例
Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://example.com表示https://example.com可以存取回應內容。如果資源可供任何網站讀取,則可將這個標頭設為*,在這種情況下,瀏覽器只會要求不使用憑證提出要求。Access-Control-Allow-Credentials: true表示允許攜帶憑證 (Cookie) 的要求載入資源。否則,即使Access-Control-Allow-Origin標頭中存在要求來源,系統也會拒絕經過驗證的要求。
預檢要求
預檢要求前面會加上 OPTIONS 要求,檢查是否允許傳送後續要求。
要求標頭範例
OPTIONS / HTTP/1.1 Origin: https://example.com Access-Control-Request-Method: POST Access-Control-Request-Headers: X-PINGOTHER, Content-Type
Access-Control-Request-Method: POST允許使用POST方法提出下列要求。Access-Control-Request-Headers: X-PINGOTHER, Content-Type允許要求者在後續要求中設定X-PINGOTHER和Content-TypeHTTP 標頭。
回應標頭範例
Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-PINGOTHER, Content-Type Access-Control-Max-Age: 86400
Access-Control-Allow-Methods: POST, GET, OPTIONS表示後續要求可使用POST、GET和OPTIONS方法。Access-Control-Allow-Headers: X-PINGOTHER, Content-Type表示後續要求可包含X-PINGOTHER和Content-Type標頭。Access-Control-Max-Age: 86400表示預檢要求結果可快取 86400 秒。
支援的瀏覽器
瞭解詳情
跨源嵌入程式政策 (COEP)
為降低基於 Spectre 的攻擊竊取跨源資源的能力,系統預設會停用 SharedArrayBuffer 或 performance.measureUserAgentSpecificMemory() 等功能。
Cross-Origin-Embedder-Policy: require-corp 會防止文件和 worker 載入跨源資源,例如圖片、指令碼、樣式表、iframe 等,除非這些資源明確選擇透過 CORS 或 CORP 標頭載入。COEP 可與 Cross-Origin-Opener-Policy 結合,將文件加入跨來源隔離。
如要為文件啟用跨來源隔離,請使用 Cross-Origin-Embedder-Policy: require-corp。
使用範例
Cross-Origin-Embedder-Policy: require-corp
使用範例
COEP 採用單一值 require-corp。傳送這個標頭後,瀏覽器就會封鎖未透過 CORS 或 CORP 選擇加入的資源。
啟用跨來源隔離
傳送 Cross-Origin-Embedder-Policy: require-corp 和 Cross-Origin-Opener-Policy: same-origin,啟用跨來源隔離。
Cross-Origin-Embedder-Policy: require-corp Cross-Origin-Opener-Policy: same-origin
回報與 COEP 不相容的資源
您可以使用 Reporting API 接收因 COEP 導致資源遭到封鎖的報告。
Cross-Origin-Embedder-Policy: require-corp; report-to="coep"COEP 也支援僅限報表模式,因此您可以在不實際封鎖載入資源的情況下接收報表。
Cross-Origin-Embedder-Policy-Report-Only: require-corp; report-to="coep"支援的瀏覽器
瞭解詳情
HTTP 嚴格傳輸安全性 (HSTS)
透過一般 HTTP 連線進行的通訊不會加密,因此網路層級的竊聽者可以存取傳輸的資料。
Strict-Transport-Security 標頭會通知瀏覽器,一律不應使用 HTTP 載入網站,而應改用 HTTPS。設定完成後,瀏覽器會使用 HTTPS (而非 HTTP) 存取網域,且在標頭定義的時間內不會重新導向。
使用範例
Strict-Transport-Security: max-age=31536000
建議用途
所有從 HTTP 轉換為 HTTPS 的網站,在收到 HTTP 要求時,都應以 Strict-Transport-Security 標頭回應。
Strict-Transport-Security: max-age=31536000支援的瀏覽器