首頁資源庫常用 CSP 內容安全政策

常用 CSP 內容安全政策

彙整實際工作中常用配置的 Content-Security-Policy 標頭值:從嚴格的起步政策,到 Google Fonts、統計分析、YouTube 嵌入、基於 nonce 的腳本、防點擊劫持。點擊卡片複製政策,設定為 Content-Security-Policy 標頭的值即可。卡片頂部的色帶每格代表一條指令,琥珀色格子表示該指令包含值得複查的 unsafe-* 來源。

嚴格起步政策(僅同源)
default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'
同源 + 任意 https 圖片
default-src 'self'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'
呼叫單一 API 來源的 SPA
default-src 'self'; connect-src 'self' https://api.example.com; img-src 'self' data:; object-src 'none'
允許 Google Fonts
default-src 'self'; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; object-src 'none'
Google Analytics 4
default-src 'self'; script-src 'self' https://www.googletagmanager.com; connect-src 'self' https://*.google-analytics.com https://*.analytics.google.com; img-src 'self' https://*.google-analytics.com; object-src 'none'
允許 YouTube 嵌入
default-src 'self'; frame-src https://www.youtube-nocookie.com https://www.youtube.com; img-src 'self' https://i.ytimg.com; object-src 'none'
nonce + strict-dynamic 腳本
script-src 'nonce-{RANDOM}' 'strict-dynamic'; object-src 'none'; base-uri 'none'
務實版:允許行內樣式
default-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'
將 http 子資源升級為 https
default-src 'self'; upgrade-insecure-requests
防點擊劫持(禁止被嵌入)
frame-ancestors 'none'
Report-Only 試執行起步
default-src 'self'; report-uri /csp-report; report-to csp-endpoint

常見問題

CSP 設定在哪裡?
最好設定為 HTTP 回應標頭:在伺服器、CDN 或託管配置中寫 Content-Security-Policy: <值>。<meta http-equiv="Content-Security-Policy"> 標籤對大多數指令也有效,但 frame-ancestors、report-uri 和 report-to 只支援標頭,包含它們的配方必須以回應標頭設定。
怎樣在不弄壞網站的情況下上線?
先用 Content-Security-Policy-Report-Only 標頭(即這裡的 Report-Only 配方):瀏覽器只回報違規,不攔截任何內容。觀察一週報告,把網站真正需要的來源補進去,再把同樣的值切換為強制標頭。
nonce-{RANDOM} 占位符怎麼用?
把 {RANDOM} 換成每次回應新生成的 base64 值,並把同一個值以 nonce="…" 寫進每個 script 標籤。配合 strict-dynamic,就只允許你輸出的腳本(及其載入的內容),注入的一律攔截,比維護主機白名單更強。
為什麼 'unsafe-inline' 標成琥珀色?
允許行內程式碼是 XSS 攻擊最常利用的缺口:注入的 <script> 或 style 屬性會像你自己的程式碼一樣執行。style-src 'unsafe-inline' 配方之所以存在,是因為不少框架仍會注入行內樣式,但請把它當作權宜之計;腳本應改用 nonce 或雜湊,所以這裡沒有任何配方包含 script-src 'unsafe-inline'。
Family Site