【发布时间】:2020-11-07 14:32:31
【问题描述】:
我的网站有很多页面,每个页面都有很多图片(几十个甚至几百个)。
我正在尝试避免图片盗链,但不会过多增加 AWS 成本。
到目前为止,我找到了 3 个选项:
选项1:使用WAF防止盗链,通过创建基于referer header的规则来阻止。
这个方案的问题是,如果你每页加载很多图片,成本会增加太多,因为除了支付S3和CloudFront,你还需要支付WAF,每个 图片请求(例如,假设您在每个页面上有 100 张图片)。
选项 2:配置 CloudFront 以触发 Lambda@Edge 查看器请求触发器,该触发器将检查前门的每个请求,并根据引用标头阻止请求。
https://stackoverflow.com/a/46044606/2444386
这类似于上面的选项。问题是您向 EVERY 请求添加了开销,即使图像已经在 CloudFront 缓存中。 Lambda@Edge 总是会被调用,如果您网站的每个页面上都有很多图像,也会增加太多的成本。
选项 3:配置 S3 存储桶策略以根据 referer 标头阻止请求,并在 CloudFront 将 referer 标头列入白名单。
到目前为止,在我看来,这似乎是成本效益最高的选项,因为如果图像已经在 CloudFront 缓存中,您就没有任何开销,而且成本也是最便宜的,因为您不需要支付 WAF 或 Lambda@Edge。
问题在于缓存命中率会小得多,因为 CloudFront 不会提供来自缓存的响应,除非传入请求的 Referer 标头与已缓存请求的完全匹配。 p>
我尝试使用“origin”请求标头来避免此问题,但似乎浏览器不会为图像 GET 请求发送此标头。
还有更好的选择吗?
【问题讨论】:
-
你最后采用了什么解决方案?我处于同样的位置。令人沮丧的是,当我在没有 CloudFront 的情况下使用 S3 时,我已经解决了这个问题;我的 S3 存储桶上有一个策略,它拒绝了所有不是来自我的网站的请求。但是,对于 CloudFront,我看不出有任何方法可以应用这样的策略。我可以将我的 S3 限制为仅允许来自 CloudFront 的流量,但我看不到如何将类似的策略应用于 CloudFront 以限制仅访问来自我的站点的请求。你最后做了什么?
-
嗨@MSOACC,我发布了一个答案,详细说明了我最终做了什么。如果可以的话,我建议你使用 CloudFlare。他们有一个防盗链选项。此外,使用 CloudFront 降低了我的成本。
-
谢谢,没看到。您应该将其标记为已接受的答案。
-
CloudFlare 的唯一缺点是您需要更改 DNS 条目。但如果可以的话,我会推荐,因为您也将获得 DDoS 保护。
-
在你问我之后,我现在才发布答案。我将标记为已接受的答案。
标签: amazon-web-services amazon-s3 amazon-cloudfront hotlinking amazon-waf