0.背景
网站的图片因为数量比较多,为了减轻网站的压力,使用了对象存储服务(阿里云的OSS),按照网站的正常流量,每月的流量费用大概几块钱,问题出现在12月初,提示我“可用余额不足”,一开始以为是服务到期了,就充了50块钱,这些钱按照以前的使用,差不多可以用半年了,结果没过两天,又提示我“可用余额不足”,才意识到可能是被盗刷了,于是开始排查问题。
1.问题
登陆阿里云,打开OSS服务,看了看区域和运营商统计,发现有大量的异常流量来自广东省。

再打开具体的“文件访问统计”,发现某个图片已经被盗刷100多G流量了,找到了问题。

2.解决方法
本文提供使用防盗链的方式进行控制。
打开阿里云的防盗链设置,将防盗链设置为已开启状态。
然后配置白名单,并把“空Referer”设置为不允许,然后点击“保存”即可

关于防盗链的工作原理如下:
当浏览器向OSS请求文件时,HTTP请求的Referer标头会标识发起请求的源页面URL。OSS通过校验Referer值来判断请求来源的合法性,基于预设规则允许或拒绝访问。
配置防盗链后,OSS将按照以下优先级顺序执行访问控制判断:
- 空Referer检查
- OSS首先判断请求的Referer字段是否为空。
- 如果为空:
- 如果配置了允许空Referer,请求将通过。
- 如果配置了不允许空Referer,则会进入一个特殊判断:只有当白名单也为空时,请求才会被允许;否则,请求将被拒绝。
- 黑名单检查
- 对于Referer不为空的请求,OSS会检查黑名单。
- 如果请求的Referer匹配到黑名单中的任何一项,请求将立即被拒绝,后续的白名单检查不再进行。
- 白名单检查
- 如果请求的Referer不为空,且没有命中黑名单,OSS会最后检查白名单。
- 如果请求的Referer能匹配到白名单中的某一项,请求将通过。
- 如果遍历完整个白名单都无法匹配,请求将被拒绝。
3.实现效果
按照上面的设置以后,可以发现文件访问统计全是失败的。

此时在浏览器里访问资源就会出现下面的内容:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AccessDenied</Code>
<Message>You are denied by bucket referer policy.</Message>
<RequestId>693A17BB79A55D31384EBB03</RequestId>
<HostId>kongkui.oss-cn-qingdao.aliyuncs.com</HostId>
<BucketName>kongkui</BucketName>
<EC>0003-00000501</EC>
<RecommendDoc>https://api.aliyun.com/troubleshoot?q=0003-00000501</RecommendDoc>
</Error>
这样就可以防止盗刷流量了。
4.后记
按照上面的那么操作确实更加安全了,但是带来了一个新问题,就是阿里云的OSS brower无法预览图片了。

打开它的调试工具可以发现,也是403,禁止访问。
询问了一下官方人员,答复是OSS brower在不允许空Referer的情况下,是不能正常访问的。
而且发现,部分手机浏览器在这种情况下是不能正常展示图片的。
最终的解决办法也是比较简单,阿里云已经有最新的方案了,就是他们的ESA方式,但是这个也要收费。