是否可以在Amazon S3中设置Content-Security-Policy标头?

Ada*_*dam 9 amazon-s3 amazon-web-services amazon-cloudfront

我正在尝试为我通过s3/cloudfront服务的html文件设置Content-Security-Policy标头.我正在使用基于Web的AWS控制台.每当我尝试添加标题时:

在此输入图像描述

它似乎并不尊重它.我该怎么做才能确保提供此标头?

Rav*_*car 9

我遇到了同样的问题(使用 S3/CloudFront),目前似乎无法轻松设置。

S3 有一个允许的标头白名单,并且 Content-Security-Policy 不在其中。虽然您确实可以使用前缀 x-amz-meta-Content-Security-Policy,但这并没有帮助,因为浏览器不支持它。

我可以看到两个选项。

1) 您可以从 EC2 实例上的网络服务器提供 html 内容,并将其设置为另一个 CloudFront 源。不是一个很好的解决方案。

2) 将 CSP 作为元标记包含在您的 html 文档中:

    <!doctype html>
    <html>
      <head>
        <meta http-equiv="Content-Security-Policy" content="default-src http://*.foobar.com 'self'">
...
Run Code Online (Sandbox Code Playgroud)

这个选项没有被浏览器广泛支持,但它似乎适用于 Webkit 和 Firefox,所以当前的 Chrome、Firefox、Safari(和 IOS 7 Safari)似乎支持它。

我选择了 2,因为它是更简单/更便宜/更快的解决方案,我希望 AWS 将来会添加 CSP 标头。

  • 第二种选择是您最好的选择,但请记住,这有局限性。例如,您可以不使用 `report-uri`,`frame-ancestors` 不起作用,可能还有其他一些我不记得的东西。 (6认同)

小智 5

如果您通过 CloudFront 进行测试,您是否确保已使缓存对象失效?您可以尝试上传一个全新的文件,然后尝试通过 CF 访问它并查看标题是否仍然存在?

更新

似乎自定义元数据不会按照 DOC 的预期工作。除了 S3 支持的元数据(下拉列表中显示的元数据)之外的任何元数据都必须以 x-amz-meta- 为前缀


iBa*_*bur 5

S3/CloudFront 接受源设置的任何标头并将它们转发给客户端,但您不能直接在响应中设置自定义标头。

您可以使用可以通过 CloudFront 注入安全标头的 Lambda@Edge 函数。

以下是该过程的工作原理:(参考 aws 博客

  • 查看器导航到网站。
  • 在 CloudFront 提供缓存中的内容之前,它将触发与该行为的查看器请求触发器关联的任何 Lambda 函数。
  • CloudFront 提供缓存中的内容(如果可用),否则转到第 4 步。
  • 只有在 CloudFront 缓存“未命中”之后,才会针对该行为触发源请求触发器。
  • S3 Origin 返回内容。
  • 从 S3 返回内容后但在 CloudFront 中缓存之前,将触发源响应触发器。
  • 在 CloudFront 中缓存内容后,将触发查看器响应触发器,这是查看器接收内容之前的最后一步。
  • 查看器接收内容。

以下是来自 aws 的博客,介绍如何逐步执行此操作。

https://aws.amazon.com/blogs/networking-and-content-delivery/adding-http-security-headers-using-lambdaedge-and-amazon-cloudfront/