由于内容-安全-策略设置,我找到了许多针对“拒绝 xyz”的各种情况的解决方案。
但是,如果''
被拒绝,我似乎无法找到可能有什么问题。
浏览器中的文字错误消息是
Refused to frame '' because it violates the following Content Security Policy directive: "frame-src *".
Run Code Online (Sandbox Code Playgroud)
它只发生在 Chrome 中。在 Firefox 或 Internet Explorer 中加载页面工作正常。
我设置了以下 CSP(这实际上是一行。为了便于阅读,我添加了新行):
default-src 'self';
script-src 'self' 'unsafe-inline' 'unsafe-eval';
style-src 'self' 'unsafe-inline';
img-src 'self' data:;
frame-src 'self' *;
object-src 'none';
font-src 'self' data:;
Run Code Online (Sandbox Code Playgroud)
现在我的理解*
是“一切”。Chrome 不爱我的原因是什么?
旁注:我们已经评估除暴安良'unsafe-inline'
和'unsafe-eval'
,但我们不能在此刻。如果这可能导致我的问题,请指出如何。否则,我知道这是一个安全隐患,我们正在努力摆脱它。现在它就在这里。
设置:网络服务器是一个 Apache:
# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
Run Code Online (Sandbox Code Playgroud)
edit1 尝试从网站内打开客户端的邮件程序时发生该错误。用户点击一个链接,邮件程序就会打开。
这可能就是 Chrome 将空字符串 ( ''
)显示为被阻止内容的原因。
我正在使用nginx 的expires
指令;它的etag
指令以及Last-Modified
标题(如果我理解正确的话)默认情况下处于打开状态。
为了在使用限制性内容安全策略(CSP)标头(即无'unsafe-inline'
资源策略)时允许特定的内联 JavaScript,我想使用随机数。
我基本上遵循了Scott Helme 关于此事的文章,在我的试验中使用 nginx$request_id
来创建nonce
ServerFault 上讨论的内容(以便快速尝试,而不必从头开始构建 nginx)。
然而,当我尝试此操作时,缓存似乎不再按我的预期工作:
Nginx 每次都以文件、新鲜Last-Modified
和ETag
标头进行响应,而不是304 Not Modified
我希望的响应。
仔细想想,这是有道理的:nonce
CSP 标头以及源代码中的 都会随着每个请求而变化。然而,其他一切都没有改变。因此,可以说,这是“弱验证器”应该忽略的更改(从而将请求的资源标记为未更改)。
话虽如此,我对服务器配置或缓存标头知之甚少,甚至一无所知。很可能我所掌握的少量知识没有帮助,而且弱验证器无论如何也不应该以这种方式工作。
此外,似乎存在一个问题,即当浏览器拥有旧文件的缓存版本nonce
但获得304 Not Modified
新文件的标头时,浏览器会感到困惑nonce
(尽管我自己在试用中没有看到这一点)。
因此,我的问题基本上是:是否可以配置nginx,以便缓存以某种方式工作,当nginx创建和标头(即它只看起来的地方)时,对唯一的更改(即通过文本替换动态发生的更改)nonce
被忽略Last-Modified
ETag
在磁盘上的文件更改时) - 有效地使用什么可能是弱验证器?
并且,假设浏览器混乱是一个问题,您是否可以采取一些措施来阻止它,例如当服务器返回 304 时不返回 CSP …