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

时间:2018-03-02 10:24:57

标签: content-security-policy

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

我想做类似的事情:

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

但显然这是无效的。

1 个答案:

答案 0 :(得分:1)

  

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

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

特别是,就CSP语法而言,myhost.com'unsafe-inline'都是CSP规范所称的“源表达式”,以及{的值{1}} CSP指令是CSP规范所称的“源列表”<​​/ em> - 即单独的各个源表达式的列表。

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

所以它的要点是:CSP没有语法来表达“仅允许script-src 的内联脚本。

有关规范的详细信息,请参阅https://w3c.github.io/webappsec-csp/#framework-directive-source-list

  

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

     
      
  1. myhost.com'none''等关键字(分别与当前网址的来源无关)

  2.   
  3. 序列化的网址,例如'self(与特定文件匹配)或https://example.com/path/to/file.js(与该来源的所有内容相匹配)

  4.   
  5. https://example.com/等计划(匹配具有指定方案的任何资源)

  6.   
  7. https:等主机(与主机上的任何资源匹配,无论方案如何)或example.com(与主机子域中的任何资源(及其任何子域的子域)匹配) ,等等))

  8.   
  9. *.example.com等符号(可以匹配网页上的特定元素)

  10.   
  11. 摘录,例如'nonce-ch4hvvbHDpv7xCSvXCs3BrNggHdTzxUA'(可以匹配网页上的特定元素)

  12.