Apache“标头集”在不同浏览器上的功能不同

Apache“标头集”在不同浏览器上的功能不同

我在 HAproxy 后面的 Apache 上运行自托管的 Nextcloud 安装。

我遇到了字体错误,类似于在此论坛帖子中描述。作为补救措施,建议进行Content-Security-Policy如下修改:

<IfModule mod_headers.c>
    Header set Content-Security-Policy: "font-src https: data:;"
    # `mod_headers` cannot match based on the content-type, however,
    # the `Content-Security-Policy` response header should be send
    # only for HTML documents and not for the other resources.
    <FilesMatch "\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$">
        Header unset Content-Security-Policy
    </FilesMatch>
</IfModule>

但是,这有一个我无法解释的影响。如果我通过 Firefox/Chrome 访问 Nextcloud,则有两个Content-Security-Policy标头:

Chrome/Firefox CSP 标头

据我所知,这会导致“Content-Security-Policy: font-src https: data:;”标头被忽略,因为它的限制较少。我遇到的问题仍然存在。

但是,如果我通过 IE 访问 Nextcloud,我会看到一个标题:

Content-Security-Policy: font-src https: data:;, default-src 'self'; script-src * 'unsafe-inline' 
'unsafe-eval'; style-src * 'unsafe-inline'; img-src * 'unsafe-inline' data:; font-src *;
 object-src 'self';media-src 'self'; frame-src 'self';

在这种情况下,问题已解决并且字体已加载。

什么原因导致 Chrome/Firefox 中出现第二个标头?我该如何解决此问题?

答案1

IE 似乎将 的两个值合并在一起Content-Security-Policy,而其他浏览器则没有,这会导致不同的行为。但问题是标头被设置了两次。有几个选项:

  1. Content-Security-Policy在您的配置中找到正在设置的其他位置,并将其删除。

  2. 您的标头值是根据条件设置的onsuccess(默认值),因此其他值也必须根据条件设置always。请参阅标头。Apache 会合并这两个列表并同时发送它们。因此,您可以清除条件中的值always

     Header always unset Content-Security-Policy
     Header onsuccess set Content-Security-Policy "font-src https: data:;"
    

    或者用你的值替换always

     Header always set Content-Security-Policy "font-src https: data:;"
    

答案2

经过进一步挖掘,我相信我已经找到了答案。

事实证明,HAproxy 正在向通过它的请求添加与安全相关的标头。这导致了重复。浏览器的不同行为是一个症状,因为 CSP 标头特定于 Chrome。

通过在 HAproxy 中引入可被不同浏览器解析的不同 CSP 标头,解决了该问题。这也解决了字体无法加载的原始问题。

也感谢安德鲁 (Andrew) 对此问题的帮助。

相关内容