0.背景

网站的图片因为数量比较多,为了减轻网站的压力,使用了对象存储服务(阿里云的OSS),按照网站的正常流量,每月的流量费用大概几块钱,问题出现在12月初,提示我“可用余额不足”,一开始以为是服务到期了,就充了50块钱,这些钱按照以前的使用,差不多可以用半年了,结果没过两天,又提示我“可用余额不足”,才意识到可能是被盗刷了,于是开始排查问题。

1.问题

登陆阿里云,打开OSS服务,看了看区域和运营商统计,发现有大量的异常流量来自广东省。

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

2.解决方法

本文提供使用防盗链的方式进行控制。

打开阿里云的防盗链设置,将防盗链设置为已开启状态。

然后配置白名单,并把“空Referer”设置为不允许,然后点击“保存”即可

关于防盗链的工作原理如下:

当浏览器向OSS请求文件时,HTTP请求的Referer标头会标识发起请求的源页面URL。OSS通过校验Referer值来判断请求来源的合法性,基于预设规则允许或拒绝访问。

配置防盗链后,OSS将按照以下优先级顺序执行访问控制判断:

  1. 空Referer检查
    • OSS首先判断请求的Referer字段是否为空。
    • 如果为空
      • 如果配置了允许空Referer,请求将通过
      • 如果配置了不允许空Referer,则会进入一个特殊判断:只有当白名单也为空时,请求才会被允许;否则,请求将被拒绝
  2. 黑名单检查
    • 对于Referer不为空的请求,OSS会检查黑名单。
    • 如果请求的Referer匹配到黑名单中的任何一项,请求将立即被拒绝,后续的白名单检查不再进行。
  3. 白名单检查
    • 如果请求的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方式,但是这个也要收费。