阿里云 OSS 如何设置防盗链, 上个月图床流量耗费50G+,请求次数10W+,什么鬼?

更新时间: 2019-11-08 11:10:41   作者: 异常教程网

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

阿里云OSS防盗链

一、背景

小哈前天陆续接到三个电话,但都因为忙于工作、下雨天等各种因素导致没接上,电话均来自杭州,心理一想,估计是阿里云的客服吧,因为之前也会偶尔接到他们的电话,比如回访之类的。

感觉应该也不是什么要紧的事儿。直到晚上,躺在床上休息的时候,无意翻动手机,鬼使神差的,我点开了短信查看。

PS: 小哈平常不怎么主动去翻短信,短信上常年数字 1000+,主要里面内容基本上是一些验证码啊、垃圾短信啊啥的,也懒得去清理。

手机短信1000+

无意间看到下面这条短信:

oss欠费通知

打了一个激灵,事情并不简单,如果还不及时续费,网站图片(小哈网站图片均存储在阿里云 OSS 对象存储上)都将无法访问!

吓得我赶紧又续费了 50 块钱!

充五十块钱

二、背后有啥猫腻

暂时解决了 OSS 快到期的问题后,我开始回想整个事情的经过。OSS 当时开通的是按时付费的,因为使用的比较少,选择按时付费要更划算一些。

但是这一个月来,小哈写博客频率高了一些,另一方面,也为了公众号文章能有个良好的阅读体验,也是能用图片展示的,就尽量少上一行代码。

但是小哈的个站,每天的访问量只有可怜的几十个IP, 但是 OSS 后台的统计是下面这个鬼样子的:

oss上个月使用情况

存储用量暂且不说,外网流出流量 50G+,图片读请求 10w+, 什么鬼啊!这个数据对于每天访问几十个IP的个站,绝对是不正常的!

支出情况

由于是按小时付费,峰值的时候,每小时就耗费5块大洋,这谁顶得住啊,账户上就那点钱,不欠费才怪呢!

问题原因,小哈首先想到的是图片被盗链了!

三、什么是盗链?

oss文件请求图谱

以下来自百度百科官方解释:

盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。

通俗来说,就是存储在小哈图片服务器上图片,在未经过授权的情况下,被别人擅自使用了。

四、为什么会被盗链?

有一些类似于下图中爬虫网站,每天大批量的爬取文章,凭着自己网站权重高,即使不是原创,也能在百度中排名靠前,赚取广告费啥的,这里不得不吐槽一下百度。

好了,回归正题,这些爬虫网站没有自己的图片服务器(因为要钱),而是直接引用的原文的图片链接:

盗链网站

盗链网站使用的图片链接地址

最终,这些图片的请求流量,全都由图片的所有者来买单。

五、OSS 设置防盗链

OSS 是按使用量收费的服务,为了减少存储于 OSS 的数据被其他人盗链而产生额外费用,OSS本身是支持设置Referer,基于 HTTP 和 HTTPS header 中表头字段Referer 的防盗链方法。

我们可以通过控制台为自己的存储空间设置 Referer 字段的白名单、以及是否允许 Referer 字段为空的请求访问。

接下来,进入阿里云控制台,设置 OSS 白名单,这里我设置为自己的网站域名 www.exception.site, 也就是说 header 请求头中, Referer 为 www.exception.site 的网站,才能被够允许访问,否则直接拒绝:

OSS设置防盗链

  • :选择需要设置防盗链的 Bucket;
  • :设置防盗链 HTTP Referer 白名单;
  • :保存;

六、验证一下效果

6.1 Referer 为空测试

通过 curl 命令来访问一下 bucket 中的某张图片,此时 header 头中的 Referer 属性值为空,看下是否能够正常访问:

随机访问一下图片

可以看到请求失败 AccessDenied.

6.2 Referer 一个不在白名单的域名测试

通过 -e 参数传递一个未设置在白名单中的地址,看能够访问成功:

不存在于oss白名单中的地址访问测试

依然不能够访问成功,测试正常!

再来验证下上面说的盗链网站是否还能够正常访问,首先我们清空浏览器缓存:

图片全部打不开了

Nice!图片已经打不开了。

舒服了

6.3 存在于白名单中的域名测试

这里小哈直接访问自己的网站来验证效果:

看下个人网站是否能够正常访问

图片请求 header 头的 Referer 属性值与设置的一致,个人网站图片均能够正常访问。

七、另外一些应对手段

除了防盗链的设置,目前来看按小时付费套餐已经不太合适了,在阿里云上购买一个下行流量包,半年6个月,每个月50G流量,价格60块大洋,当然了,超出的得另算。

阿里云半年流量包

如果说未来流量继续增大的话,那就要考虑带过期时间的图片访问、CDN, 以及购买回源流量包了,那就是后话了,有机会小哈再给大家分享。下期见!

Ref