是否可以使用Content-Security-Policy来允许来自一个主机的内联脚本,但只允许来自其他主机的外部脚本?

问题描述 投票:0回答:1

是否可以使用Content-Security-Policy来允许来自一个主机的内联脚本,但只允许来自其他主机的外部脚本?

我想做点什么:

Header set Content-Security-Policy script-src myhost.com 'unsafe-inline'; script-src someothersite.com

但显然这是无效的。

content-security-policy
1个回答
1
投票

是否可以使用Content-Security-Policy来允许来自一个主机的内联脚本,但只允许来自其他主机的外部脚本?

不,这是不可能的。内容安全政策(设计,真的)缺乏任何表达方式。

特别是,就CSP语法而言,myhost.com'unsafe-inline'都是CSP规范称之为“源表达式”,而script-src CSP指令的值是CSP规范称之为“源列表” - 即a单独的单个源表达式列表。

在CSP源列表中,源表达式在内部没有任何关系 - 相反,它们每个都适用于它们所属的整个指令。因此,如果您为'unsafe-inline'指令的值指定script-src,那么它始终具有全局允许文档中的任何位置的内联脚本的效果。

所以它的要点是:CSP没有语法来表达“只允许myhost.com的内联脚本”。


有关规范的详细信息,请参阅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'这样的nonce(可以匹配页面上的特定元素)
  6. 'sha256-abcd...'等摘要(可以匹配页面上的特定元素)
© www.soinside.com 2019 - 2024. All rights reserved.