Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 是否可以在AmazonS3中设置内容安全策略头?_Amazon Web Services_Amazon S3_Amazon Cloudfront - Fatal编程技术网

Amazon web services 是否可以在AmazonS3中设置内容安全策略头?

Amazon web services 是否可以在AmazonS3中设置内容安全策略头?,amazon-web-services,amazon-s3,amazon-cloudfront,Amazon Web Services,Amazon S3,Amazon Cloudfront,我正在尝试为通过s3/cloudfront提供服务的html文件设置内容安全策略头。我正在使用基于web的AWS控制台。每当我尝试添加标题时: 它似乎不尊重它。如何确保提供此标头?如果您正在通过CloudFront进行测试,是否确保已使缓存对象无效?您是否可以尝试上载一个全新的文件,然后尝试通过CF访问它,看看是否仍然没有标题 更新 根据文档,自定义元数据似乎无法按预期工作。除了S3支持的元数据(下拉列表中显示的元数据)之外的任何元数据都必须以x-amz-meta-作为前缀。我也遇到了同样的问

我正在尝试为通过s3/cloudfront提供服务的html文件设置内容安全策略头。我正在使用基于web的AWS控制台。每当我尝试添加标题时:


它似乎不尊重它。如何确保提供此标头?

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

更新


根据文档,自定义元数据似乎无法按预期工作。除了S3支持的元数据(下拉列表中显示的元数据)之外的任何元数据都必须以x-amz-meta-

作为前缀。我也遇到了同样的问题(使用S3/CloudFront),而且目前似乎没有办法轻松设置

S3有一个允许的标题白名单,而内容安全策略不在其中。虽然确实可以使用前缀为x-amz-meta-Content-Security-Policy,但这没有帮助,因为浏览器不支持它

我可以看到两种选择

1) 您可以在EC2实例上提供Web服务器上的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头。

S3/CloudFront会获取源站设置的任何头并将其转发给客户端,但您不能直接在响应上设置自定义头

你可以用Lambda@Edge可以通过CloudFront注入安全头的函数

以下是该过程的工作原理:()

  • 浏览者导航到网站
  • 在CloudFront从缓存中提供内容之前,它将触发任何 与查看器请求触发器关联的Lambda函数 行为
  • CloudFront提供缓存中的内容(如果可用),否则 转到步骤4
  • 只有在CloudFront缓存“未命中”后,才会触发源请求触发器 因为这种行为
  • S3origin返回内容
  • 在从S3返回内容之后但在缓存到 CloudFront,启动原点响应触发器
  • 在CloudFront中缓存内容后,将触发查看器响应触发器 已激发,是查看器接收内容之前的最后一步
  • 查看器接收内容
下面是aws关于如何一步一步完成的博客


不,这不起作用。我上传了一个新文件并设置了头,但是当通过cloudfront或s3访问时,头不会显示出来。当我刷新aws控制台时,标题甚至没有出现在元数据部分下,就好像它没有被保存一样。看起来自定义元数据将无法按照预期工作。除S3支持的元数据(下拉列表中显示的元数据)之外的任何元数据都必须以x-amz-meta作为前缀-第二个选项是最好的选择,但请记住,这是有限制的。例如,您可以不使用
报告uri
帧祖先
不起作用,可能还有一些我从头顶上记不起来的东西。你现在可以用了Lambda@Edge为了在缓存到cloudfront之前修改原始响应,我必须在需要额外头的SPA上执行相同的操作,这是最好的方法。我只提到一点,使用originresponse触发器而不是viewerresponse来节省lambda的费用。使用第一个将缓存带有头的响应(调用lambda@edge每个区域初始化缓存一次),而第二个区域将为每个请求使用lambdalambda@edge触发器工作以及此处最适合使用的事件:包括成本优化详细信息。