如何为特定内容安全策略指令将特定域列入白名单,而对其他域具有不太具体的指令?

时间:2017-11-22 20:47:35

标签: content-security-policy

我想对'script-src'政策允许'unsafe-eval',但仅限于特定域。

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

class Category < ApplicationRecord
  has_many :subcategories
  has_many :products, through: :subcategories
end

class Subcategory < ApplicationRecord
  has_many :products
  belongs_to :category
end

class Product < ApplicationRecord
  belongs_to :subcategory
end

以上不起作用。我怎样才能实现这种行为?

1 个答案:

答案 0 :(得分:2)

  

我想对'script-src'政策允许'unsafe-eval',但仅限于特定域。
  我怎样才能实现这种行为?

你做不到。内容安全策略没有提供这样做的方法。

'unsafe-eval'*.example.net只是CSP规范称为“源表达式”的不同类型,以及{{1}等CSP指令的值是CSP规范所称的“源列表”<​​/ em> - 单独的各个源表达式的列表。

CSP源列表中的源表达式之间没有内部关联 - 相反,它们都将全局应用于与其关联的指令。

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

CSP中没有其他语法可以表达“仅允许eval()'unsafe-eval' 。在CSP中无法表达这一点。

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

  

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

     
      
  1. *.example.net'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.