您如何将特定内容安全策略指令的特定域列入白名单,而其他域的指令则不那么具体?

You*_*l-Y 4 content-security-policy

我想为“ script-src”策略允许“ unsafe-eval”,但仅针对特定域。

例如,我只希望来自* .example.net的脚本能够使用eval()。

script-src 'unsafe-inline' *;script-src 'unsafe-eval' 'unsafe-inline' *.example.net blob:;
Run Code Online (Sandbox Code Playgroud)

上面的方法不起作用。我该如何实现这种行为?

sid*_*ker 5

我想为“ script-src”策略允许“ unsafe-eval”,但仅针对特定域。
我该如何实现这种行为?

你不能 内容安全策略没有提供实现此目的的方法。

两者'unsafe-eval'*.example.net都是CSP规范称为“源表达式”的不同类型,而CSP指令script-src称为“源列表”的CSP指令的值是单独的各个源表达式的列表。

CSP源列表中的源表达式彼此之间没有内部关联-而是它们每个都全局地应用于与其关联的指令。

因此,如果您指定指令'unsafe-eval'的值script-src,则始终具有全局允许eval()文档中依赖的任何JavaScript代码的效果。

有没有其他的语法CSP表示“仅允许'unsafe-eval'用于*.example.net。根本无法在CSP中表达这一点。


https://w3c.github.io/webappsec-csp/#framework-directive-source-list

许多指令的值由源列表组成:字符串集,用于标识可以获取并可能嵌入或执行的内容。每个字符串代表以下类型的源表达式之一

  1. 诸如'none''self的关键字(分别不匹配任何内容和当前URL的来源)

  2. 序列化的URL,例如https://example.com/path/to/file.js(与特定文件匹配)或https://example.com/(与该原始文件上的所有内容匹配)

  3. 方案,例如https:(与具有指定方案的任何资源匹配)

  4. 主机(例如example.com(与主机上的任何资源匹配,而与方案无关)或*.example.com(与主机的子域(及其子域的任何子域,等等)匹配)

  5. 随机数,例如'nonce-ch4hvvbHDpv7xCSvXCs3BrNggHdTzxUA'(可以匹配页面上的特定元素)

  6. 摘要,例如'sha256-abcd...'(可以匹配页面上的特定元素)