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