发布时间: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。这些新功能经过精心设计和实现,可让网站设置一项政策,以便在支持新功能的浏览器中提供更好的安全性,同时不会在不支持新功能的浏览器中造成中断或降低安全性,也无需进行 User-Agent 检测。
使用场景
将特定网址列入许可名单,以便与 script-src 搭配使用
如果网站想要将特定脚本列入白名单以用于 script-src,目前有两种选择:通过子资源完整性 (SRI) 将脚本内容列入白名单,或使用 host-source 将主机名列入白名单。对于经常更改的脚本(例如分析脚本),SRI 通常不太实用。如果还设置了 strict-dynamic,则指定 host-source 将被忽略,并且由于它不包含网址参数,因此不是全面的保护措施。此更改将允许使用脚本的(完整)网址的哈希值来将脚本列入许可名单,从而支持动态脚本和使用 strict-dynamic 的配置。
将特定脚本列入许可名单,以便与 eval 或类似 eval 的函数搭配使用
有些网站需要使用 eval 或类似 eval 的函数(在 setTimeout、setInterval 和 setImmediate 中传递代码作为字符串字面量)。对于这些网站,唯一可用的 CSP 选项是 unsafe-eval,它允许所有对 eval 的调用。我们正在添加一种机制,以将特定输入列入 eval 的许可名单。这种新机制允许通过直接对脚本内容进行哈希处理来精确地将所需脚本添加到许可名单中,而不是被迫提供过于宽泛的 unsafe-eval CSP。
开始使用
如需试用脚本和 eval 哈希支持,请加入
CSP script-src 源试用中的网址和 eval 哈希,该试用从 Chrome 141 开始,到 Chrome 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() 用法都将启用,而在支持评估哈希的浏览器上,仅允许使用 alert("hello world") 的 eval()。
Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"
分享反馈
我们很乐意听取开发者对 script-src 的这些扩展功能的反馈。请在 GitHub 上的说明中以问题的形式发布任何评论。