违反内容安全政策

Content Security Policy violation

在我的页面上,我给出了层次结构:

Page - http://179.15.31.103/path

|- frame - //proxy.domain.training/path 

    |- frame - https://app.domain.training/path

内框自带header

Content-Security-Policy:frame-ancestors app.domain.training proxy.domain.training domain.training *.domain.training 179.15.31.103 

看起来一切都是正确的,但我在 chrome 中遇到了这样的错误(ff 中也有错误):

Refused to display 'https://app.domain.training/path' in a frame because an ancestor violates the following Content Security Policy directive: "frame-ancestors app.domain.training proxy.domain.training domain.training *.domain.training 179.15.31.103".

我认为这可能是因为 https,但我无法检查它。

我建议将 URL 方案添加到您 Content-Security-Policy header 中的域中。您可能最终不得不指定域两次以涵盖 httphttps,但它似乎确实解决了问题。

我遇到了类似的问题;如果 parent 页面是通过普通 http 提供的,而 iframed 页面是为 CSP header 提供的,其中包含 parent 域但没有 URL 方案,则 Firefox Chrome 会给出你引用的错误。

我在 Pale Moon(一个 Firefox 分支)的发行说明中找到了关于为什么会发生这种情况的最大线索:

26.5.0 (2016-09-28) Fixes/Changes:

Implemented a breaking CSP (content security policy) spec change; when a page with CSP is loaded over http, Pale Moon now interprets CSP directives to also include https versions of the hosts listed in CSP if a scheme (http/https) isn't explicitly listed. This breaks with CSP 1.0 which is more restrictive and doesn't allow this cross-protocol access, but is in line with CSP 2 where this is allowed.

https://www.palemoon.org/releasenotes-archived.shtml

但是,Pale Moon 26.5.0 的行为似乎与 Firefox 和 Chrome.

类似

Scott Helme 也在博文中提到了 similar issue 与 Safari 的关系,但听起来这个问题现在已经解决了。

另一件需要注意的事情是框架页面是否也提供 X-Frame-Options header。我相信 Firefox 和 Safari 是唯一支持此 header 和 CSP 的 frame-ancestors header 的浏览器,当然在 Firefox 的情况下 X-Frame-Options 似乎确实优先。使用 X-Frame-Options ALLOW-FROM 时,您只能指定一个 URI,因此您可能需要根据需要考虑针对不同的浏览器更改 header。