Dan*_*iel 5 amazon-s3 amazon-web-services hotlinking amazon-cloudfront amazon-waf
我有一个包含很多页面的网站,每个页面都有很多图像(数十甚至数百)。
我试图避免图像热链接,但不会增加太多 AWS 成本。
到目前为止我发现了3个选择:
选项 1:使用 WAF 来防止热链接,方法是创建基于引用标头进行阻止的规则。
这个解决方案的问题是,如果你每个页面加载很多图片,成本会增加太多,因为除了支付 S3 和 CloudFront 费用之外,你还需要为每个图片请求支付 WAF 费用(想象一下,如果你有 100 张图片)例如,在每个页面上)。
选项 2:配置 CloudFront 以触发 Lambda@Edge Viewer 请求触发器,该触发器将检查进入前门的每个请求,并根据引用标头阻止请求。
这与上面的选项类似。问题在于,即使图像已经在 CloudFront 缓存中,您也会为每个请求增加开销。Lambda@Edge 将始终被调用,并且如果您网站的每个页面上都有许多图像,也会增加太多成本。
选项 3:配置 S3 存储桶策略以根据 Referer 标头阻止请求,并在 CloudFront 将 Referer 标头列入白名单。
到目前为止,在我看来,这是成本效益最好的选项,因为如果图像已经在 CloudFront 缓存中,那么您就没有任何开销,而且成本也是最便宜的,因为您不需要支付 WAF,也不需要支付任何费用。 Lambda@Edge。
问题是缓存命中率会小得多,因为除非传入请求的 Referer 标头与已缓存请求中的Referer 标头完全匹配,否则 CloudFront 不会提供来自缓存的响应。
我尝试使用“origin”请求标头来避免此问题,但浏览器似乎不会为图像 GET 请求发送此标头。
有更好的选择吗?
我最终使用了选项 3(S3 存储桶策略)并另外使用了CloudFlare的免费计划。即使在免费计划中,CloudFlare 的“Scrape Shield”中也有“Hotlink Protection”。
用于防止热链接的 S3 存储桶策略:
{
"Version": "2012-10-17",
"Id": "http referer policy",
"Statement": [
{
"Sid": "Allow access only from my website",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::resources.mywebsite.com/*",
"Condition": {
"StringNotLike": {
"aws:Referer": [
"https://dev.mywebsite.com:8080/*",
"https://staging.mywebsite.com/*",
"https://www.mywebsite.com/*"
]
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
在 CloudFront 中,我将 Referer 标头列入白名单:
在 CloudFlare 中,您可以在“Scrape Shield”菜单中启用“Hotlink Protection”选项:
| 归档时间: |
|
| 查看次数: |
1297 次 |
| 最近记录: |