如果资源的方案是http://或https://,则CSP url-scheme http://匹配

时间:2017-01-27 09:19:44

标签: security iframe specifications content-security-policy

让我们采用frame-ancestors指令。假设我想允许http://*.parent.comhttps://child.comhttp://child.com加载我的网页:

  1. 如果我设置frame-ancestors https://*.parent.com我们有明显的违规行为
  2. 如果我设置frame-ancestors *.parent.com,我们就会违反https://child.com
  3. 如果我设置frame-ancestors http://*.parent.com,它适用于这两种情况。为什么?
  4. 引用CSP2 spec

      
        
    1. 如果源表达式的方案部分与url-scheme不区分大小写匹配,则返回不匹配。
    2.   
    3. 如果源表达式没有方案,则如果满足以下任何条件,则返回不匹配:      
          
      1. 受保护资源的URL的方案是HTTP的不区分大小写的匹配,并且url-scheme不是HTTP或HTTPS的不区分大小写的匹配
      2.   
      3. 受保护资源的URL的方案不是HTTP的不区分大小写的匹配,并且url-scheme不是受保护资源的URL方案的不区分大小写的匹配。
      4.   
    4.   

    我的示例中的案例2必须根据规范的条件5.2来阻塞,因为https://child.com与HTTP不匹配,我理解。
    但为什么案例3适用于https://child.com?根据条件4,它应该失败,因为http://*.parent.comhttps://child.com的方案不匹配。我错过了什么?

1 个答案:

答案 0 :(得分:0)

<强>目标

允许http://*.parent.comhttps://child.comhttp://child.com加载我的网页

案例3

child.com上的CSP政策:

frame-ancestors http://*.parent.com
  

但为什么案例3适用于https://child.com

如果您浏览,例如http://1.parent.com,其中包含child.com个内容,例如:

<iframe src="https://child.com/mycontent">

....然后child.com会针对请求frame-ancestors的网址检查其CSP /mycontent表达式,即:

http://1.parent.com与匹配的http://*.parent.com进行比较,以便成功返回/mycontent

  

根据条件4,它应该失败,因为http://*.parent.com   与https://child.com的方案不符。我错过了什么?

听起来有点像你可能会误解frame-ancestors。在您的示例中,不会对https://child.com进行任何检查。该检查由 child.com 进行,将请求/mycontent的网址与http://*.parent.com进行比较。也许您将frame-ancestorsframe-src混淆了?

至于规范,我发现很难理解,但幸运的是我发现this very helpful page将其翻译成更容易理解的内容。我会引用相关的一点:

  

5 - 如果CSP中列入白名单的主机没有方案,则允许浏览器:

     

1 - 如果使用HTTP提供页面,则使用HTTP或HTTPS加载资产。

     

2 - 如果使用HTTPS提供页面,则使用HTTPS加载资源。

从我已经完成的所有阅读中,忽略CSP表达式中的URL方案应该隐式地允许httphttps请求。但实际上,使用frame-ancestors,它根本不适用于我......而且在浏览器中也是如此。

因此,我使用CSP frame-ancestors的实践经验让我相信,为了授予对网站的访问权限,以便他们可以iframe 我的网站的内容,我需要为我的网站的CSP frame-ancestors表达式中包含URL方案的域。

通常我会同时允许httphttps,因此我需要,例如:

frame-ancestors http://*.parent.com https://*.parent.com