违反内容安全政策
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 中的域中。您可能最终不得不指定域两次以涵盖 http
和 https
,但它似乎确实解决了问题。
我遇到了类似的问题;如果 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。
在我的页面上,我给出了层次结构:
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 中的域中。您可能最终不得不指定域两次以涵盖 http
和 https
,但它似乎确实解决了问题。
我遇到了类似的问题;如果 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。