發布日期:2025 年 11 月 17 日
從 Chrome 141 開始,您可以加入來源試用,測試 Chrome 推出的全新內容安全政策 (CSP) 功能。這些功能可讓網站更妥善地將已知 JavaScript 來源加入允許清單,防範跨網站指令碼 (XSS) 攻擊。將已知的 JavaScript 加入允許清單,並封鎖所有其他來源,是防止 XSS 的有效方法。攻擊者注入的 JavaScript 不會列入允許清單,因此會遭到封鎖。
如果沒有這些功能,就難以制定「嚴格」的 CSP,允許所有 JavaScript 來源,且腳本主機和網站之間沒有隨機數通訊機制,或事先知道腳本的完整雜湊值。如果指令碼經常變更,且是由可信任但獨立的第三方代管,這兩種方法都不容易部署。此外,如果任何指令碼需要使用 eval,CSP 目前會要求您將 eval 加入所有指令碼的允許清單,這會大幅削弱 CSP 的效力。
為解決這個問題,我們在 script-src 中提供更強大的機制,可根據網址將指令碼加入允許清單,並提供機制將對 eval 的呼叫加入允許清單。您可以在 script-src 中使用現有的雜湊機制,將特定指令碼的網址和傳遞至 eval (和其他類似 eval 的函式) 的 JavaScript 加入允許清單。雖然以網址為準的許可清單可能不如以完整性為準的 CSP 嚴格,但這個機制應該能大幅改善現有的主機名稱許可清單。
我們認為這樣做可簡化 CSP 政策的部署作業,同時封鎖未獲允許的內嵌和 eval 指令碼,有效防範 XSS 攻擊。這些新功能經過精心設計及實作,可讓網站設定政策,在支援新功能的瀏覽器中提供更完善的安全防護,同時不會導致瀏覽器發生中斷或安全防護倒退的情形,也不必進行使用者代理程式嗅探。
用途
將特定網址列入許可清單,以便搭配 script-src 使用
如要允許特定指令碼搭配 script-src 使用,網站目前有兩種做法:透過子資源完整性 (SRI) 將指令碼內容加入允許清單,或使用 host-source 將主機名稱加入允許清單。對於經常變更的指令碼 (例如數據分析指令碼),SRI 通常不實用。如果同時設定 strict-dynamic,系統會忽略指定主機來源,且由於未包含網址參數,因此無法提供全面保護。這項變更可讓您使用 (完整) 網址的雜湊值,將指令碼加入允許清單,並支援動態指令碼和使用 strict-dynamic 的設定。
將特定指令碼加入允許清單,以便搭配 eval 或類似 eval 的函式使用
部分網站需要使用 eval 或類似 eval 的函式 (在 setTimeout、setInterval 和 setImmediate 中將程式碼做為字串常值傳遞)。對於這類網站,唯一可用的 CSP 選項是 unsafe-eval,可啟用對 eval 的所有呼叫。我們將新增機制,允許將特定輸入內容加入評估許可清單。這個新機制可直接對指令碼內容進行雜湊處理,以精確地將所需指令碼加入許可清單,而不必提供過於廣泛的 unsafe-eval CSP。
開始使用
如要試用指令碼和 eval 雜湊支援功能,請加入
CSP script-src 來源試用中的網址和 eval 雜湊,這項試用活動將於 Chrome 141 至 144 版期間進行。
在「script-src」中新增雜湊
如要將網址加入許可清單,請在 url-<hash-algorithm>-<script-url-hash> 形式的 script-src CSP 指令中新增值。這樣一來,無論該網址提供什麼內容,都能執行。雜湊值只需要包含初始網址 (網頁上包含的網址),不需要包含該網址重新導向的任何網址。支援絕對和相對網址。
舉例來說,下列 CSP 標頭會將 https://example.com/example.js 提供的指令碼加入允許清單:
Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';
其中 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' 是「https://example.com/example.js」的 sha256 雜湊值。
透過 eval 或 new Function 評估的指令碼可以加入許可清單,方法是在指令碼 src 中加入 eval-<hash-algorithm>-<script-contents-hash>。舉例來說,下列 CSP 標頭會將字串 alert("hello world") 傳遞至 eval(),並加入允許清單:
Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';
其中 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=' 是 alert("hello world") 的 sha256 雜湊。
為協助啟動採用程序,網站選擇加入原始碼試用時,網址和 eval 的雜湊值會列印到開發人員工具控制台,並納入 CSP 報告。也就是說,您可以使用嚴格的 report-only 政策,列出許可清單所需的所有雜湊值。
維持回溯相容性
如要在所有瀏覽器新增支援功能前允許部署這些政策, 可以在以主機為準的允許清單後列出網址雜湊。瞭解新雜湊類型的瀏覽器會忽略先前的以主機為準的允許清單,而不瞭解新雜湊類型的瀏覽器仍會強制執行以主機為準的允許清單,因此網站可以同時設定兩者,在支援的瀏覽器中採用較嚴格的政策,而不必擔心在不支援的瀏覽器中發生中斷,如下例所示。
Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
我們也推出了 strict-dynamic-url,這個選項與 strict-dynamic 類似,但只會在設定網址雜湊時套用。由於 strict-dynamic 會導致系統忽略以主機為準的允許清單,因此如果網站想將特定雜湊值加入允許清單,並套用 strict-dynamic,可以使用下列政策:
Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
在本例中,尚未支援雜湊的瀏覽器只會強制執行 https:。如果存在 eval 雜湊,支援的瀏覽器也會忽略 unsafe-eval。舉例來說,系統會將下列政策評估為 unsafe-eval。這樣一來,在尚不支援 eval 雜湊的瀏覽器上,所有 eval() 都能正常運作,而在支援 eval 雜湊的瀏覽器上,則只允許 alert("hello world") 的 eval()。
Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"
提供意見
我們很想聽聽開發人員對這些擴充功能的意見,請前往 script-src 提供回饋。如要提出任何意見,請在 github 的說明文件中回報問題。