0

我无法将注意力集中在注释和编码方式上,例如在 html5 样板中的 .htaccess 文件中仅为 .html 设置标题。

大代码块的线索在于“mod_headers 无法匹配内容类型”(如 # 注释)。所以我徘徊1:为什么a中有一个' Header unset' <FilesMatch>,刚刚被宣布为不可能?

<IfModule mod_headers.c>  

   Header set Content-Security-Policy "script-src 'self'; object-src 'self'"  

   # `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]|woff2?|xloc|xml|xpi)$">
     Header unset Content-Security-Policy
   </FilesMatch>  

</IfModule>  

我到处看了看,但只登陆了具有相同的,几乎是仪式使用的代码块的页面,没有进一步的解释。所以问题2:为什么像这样的简单声明是不可能的?:

<IfModule mod_headers.c>

  # Content-Security-Policy for .html files
  <FilesMatch "\.(html)$">
    Header set Content-Security-Policy "script-src 'self'; object-src 'self'"
  </FilesMatch>

  # OR like this 
  <Files ~ "\.(html)$">
    Header set Cache-Control "public, must-revalidate"
  </Files>  

</IfModule>
4

1 回答 1

1

可以按照您的第二个示例执行此操作。但 .html 并不是唯一可以作为文档发送的文件。您还可以使用 .php 或 .htm 或任何其他数量的文件。其中一些(如 .php)可能会执行,然后最终返回 HTML,但服务器不知道这一点,因为它在此阶段只知道文件扩展名。

应该在所有文档上设置 CSP,但为了节省标题带宽,不需要在这些文档使用的资产(例如图像、样式表、javascript...等)上设置。除了浪费带宽之外,在其他文档上设置它并没有真正的危害。

理想情况下,您将根据返回的 mime 类型(在上面的 PHP 示例中为 HTML)设置它。所以任何时候返回一个 HTML 文档然后设置它,否则不要。但是,由于这是不可能的,因此您有两种选择:

  1. 默认情况下将其设置在所有内容上,然后为已知媒体类型显式取消设置。这几乎可以保证它将在文档上设置,但也有可能在其他一些文件类型上设置它(例如,如果您没有为该类型明确取消设置它) - 正如我所说的那样,这并不是那么糟糕。

  2. 明确说明您的 HTML 文档类型(如您的第二个示例)。这里的风险是您现在或将来其他人开始在您的站点上使用 php 时会丢失文件类型(例如 .php)。

第一个选项是更安全的选项。特别是对于 html5boiler 板,他们不知道在使用它的网站上将使用什么技术。站点可能使用 .php、.cgi、.asp 或任意数量的技术来生成 HTML 文档。他们甚至可以将请求代理到后端服务器,因此它们不会是文件扩展名。

说得通?

于 2016-03-28T18:41:21.570 回答