Content-Security-Policy 现在使用 'strict-dynamic'

是的!

MDN 有一个很好的解释和示例。

'strict-dynamic' 源表达式指定,通过使用 nonce 或哈希明确授予标记中存在的脚本的信任,将传播给该根脚本加载的所有脚本。

因此,只要原始脚本是受信任的(通过 nonce),浏览器就允许它无限制地加载任何其他脚本。然后,由于这些脚本是受信任的,它们可以加载更多!


有一个警告,那就是脚本不能是“解析器插入”的。这可以防止 strict-dynamic 被用于 XSS 攻击。

因此,例如,这将被视为“解析器插入”并被阻止:

document.head.appendChild("<script src='https://example.com/xss-attempt.js' />");

但是,以编程方式构造脚本元素不涉及 HTML 解析,不太可能是 XSS 向量,因此是被允许的:

const script = document.createElement("script");
script.src = "https://example.com/script.js"
document.head.appendChild(script);

^^ 这基本上就是 loadScript() 的工作方式

3 个赞