我正在尝试阻止来自特定域的Cloudfront文件的热链接。通过在线示例和亚马逊自己的策略生成器的组合,我得出了这个:
{
"Version": "2008-10-17",
"Id": "http referer policy",
"Statement": [{
"Sid": "Block image requests",
"Action": "s3:GetObject",
"Effect": "Deny",
"Resource": "arn:aws:s3:::mybucket/subdir/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"http://example.com/*"
]
}
},
"Principal": {
"AWS": "*"
}
}]
}
我在mybucket
的子目录中发送了一个文件的无效请求,然后几分钟后尝试重新加载图像,同时仍然发送了引用标头(使用Chrome的开发工具验证)。使用Ctrl + F5进行了硬重新加载,响应头包含“X-Cache:来自云端的小姐”,因此它肯定会获得最新版本的图像。
但是图像仍然显示正常并且没有被阻止。策略生成器没有“aws:Referer”键的选项,但它位于Amazon docs here。我在这里做错了吗?
答案 0 :(得分:1)
更新2
重新审视您的政策我想知道您是如何实际允许CloudFront首先访问您的对象的?您是否偶然遵循了例如公共建议。 Start Using CloudFront with Amazon S3 您必须确保将对象权限设置为让所有内容公开,以用于Amazon S3存储桶中的每个对象。
在这种情况下,由于可用的三种不同的S3访问控制机制之间的相互作用,您可能偶然发现了相关的陷阱,这可能相当混乱。例如,这可以解决在Using ACLs and Bucket Policies Together中:
当您将ACL和存储桶策略分配给存储桶时,Amazon S3 评估现有的Amazon S3 ACL以及存储桶策略 确定帐户对Amazon S3的访问权限时 资源。如果帐户可以访问ACL或策略的资源 指定,他们能够访问所请求的资源。
因此,您需要将ACL迁移到存储桶策略(即在拒绝通过 aws:referer 之前允许CloudFront访问)并在此后删除过于宽泛的ACL。
祝你好运!更新1
好的,现在有了客户端缓存方式,我担心这会非常简单(在AWS论坛中搜索aws:referer时很明显),因此可能需要几次迭代(特别是考虑到你已经自己研究了这个话题:
HTTP referer
标题不一定可用,请参阅例如Referer Hiding(因此,您的政策无论如何都不会阻止恶意访问,尽管这显然不是问题)
该政策乍看起来很不错 - 在进一步深入此方向之前,我建议您确保成功绕过Chrome的缓存,notoriously less straight forward比其他浏览器习惯的那样;特别是,Ctrl + F5
只是重新加载页面,但不 Bypass the cache (至少不可靠)!
如同在那里记录的那样,您可以使用其他一个组合键重新加载页面并绕过缓存(包括第一个重新加载后的第二个Ctrl + F5
混乱),但是,我建议改为提供以下两种选择之一:
Ctrl + Shift + N
)让Google Chrome无法存储您访问过的网站的信息,截至今天(当然可能随时更改)似乎包括缓存的内容,cookie,DNS等等,因此现在是一个更快,但不太明确的选项。