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

时间:2013-11-06 23:48:14

标签: amazon-web-services amazon-s3 amazon-cloudfront

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

enter image description here

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

3 个答案:

答案 0 :(得分:4)

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

<强>更新

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

答案 1 :(得分:4)

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

S3具有允许的标头的白名单,并且不包含Content-Security-Policy。虽然确实可以使用带前缀的x-amz-meta-Content-Security-Policy,但由于没有浏览器支持,因此无用。

我可以看到两种选择。

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

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

    <!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标题。

答案 2 :(得分:1)

S3 / CloudFront会采用原始​​设置的所有标头并将其转发给客户端,但是您不能在响应中直接设置自定义标头。

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

以下是该过程的工作方式:(reference aws blog

  • 查看器导航到网站。
  • 在CloudFront提供缓存中的内容之前,它将触发任何 与Viewer Request触发器相关联的Lambda函数 行为。
  • CloudFront从缓存中提供内容(如果可用),否则 转到步骤4。
  • 仅在CloudFront缓存“ Miss”之后,才会触发“原始请求”触发器 对于这种行为。
  • S3 Origin返回内容。
  • 从S3返回内容之后但在将其缓存之前 CloudFront,原始响应触发器已触发。
  • 在CloudFront中缓存内容之后,“查看器响应”触发器为 已触发,这是查看者接收内容之前的最后一步。
  • 查看器接收内容。

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

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