14

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

在此处输入图像描述

它似乎不尊重它。我能做些什么来确保提供此标头?

4

3 回答 3

10

我遇到了同样的问题(使用 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'">
...

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

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

于 2014-11-19T06:34:36.753 回答
6

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/

于 2019-09-23T17:02:50.730 回答
5

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

更新

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

于 2013-11-11T09:25:50.250 回答