OSS文件上传与黑灰产对抗
OSS文件上传与黑灰产对抗
接下来围绕企业对于需要OSS的业务建设进行分析与学习
基础
STS Token
STS(Security Token Service)是云厂商提供的一种临时访问权限管理服务,用户可以通过该服务申请临时的安全令牌来访问云厂商资源,STS Token的优势如下:
- 减少长期访问密钥的泄漏风险
- STS Token具有实效性,可以自定义失效时间,无需定期轮换
- 可以给STS Token绑定自定义权限策略,云资源授权更灵活
开发中的使用
一般来说,文件上传功能点,业内成熟的方案是客户端上传,即前端直传OSS,文件不用经过后端服务器,这在一定程度上能够减少服务带宽,提升用户体验
简单概括一下这个方案:前端向后端申请一个临时的STS Token,前端再使用该Token直接将文件上传到OSS

更详细的实践可以参考阿里云官方文档:https://help.aliyun.com/zh/oss/user-guide/uploading-objects-to-oss-directly-from-clients/
值得一提的是,除了这个方案,阿里云官方还提供了两个客户端直传方案,不过由于不支持大文件分片以及断点续传,所以使用的较少:

安全问题与解决方案
我们可以看出来,这种情况存在如下的风险: 黑灰产可以通过抓包获取到STS Token,再使用阿里云的SDK直接上传文件到OSS,这样上传文件不会经过风控审核,并且可以获取到OSS上存储文件的链接,进行传播,甚至是消耗公司的CDN资源来加载他们上传的视频文件
怎么解决这个问题呢?与黑灰产对抗主要是要提升黑灰产的利用成本,我们可以从多方面来思考,最基本的就是:公司内应当统一做好上传功能的管理,规范一套符合公司标准的文件上传SDK,如果需要用到存储桶上传功能的话,可以到OSS管理平台申请,并且功能绑定到APP ID上,并且接入时鉴权到位
另外还能从上传逻辑与STS Token管理上来思考
上传逻辑层面
从逻辑层面上,一个经典的方案是二次提交: 我们思考存在文件上传的功能点,头像上传、 问卷提交、富文本编辑…不难发现,这些功能在上传了图片之后通常需要二次点击确定,提交表单数据,所以我们可以根据这一点来设防:
- 首先是上传图片,上传之后返回图片url地址,此时的地址是无法访问的,对应存储桶的图片权限为私有(例如x-oss-object-acl:private),前端仅使用本地缓存来展示图片预览
- 然后是点击确认,提交数据表单,后端提前录入好这个接口的响应,在提交表单成功后,接口正确响应,此时后端会修改上传的资源的权限为defaut,此时才可以根据url地址进行访问
那么在这种情况下,即使黑灰产使用SDK上传大量文件,也是不可访问的,而如果黑灰产想要利用业务接口来修改文件权限,就需要大量请求,将会触发业务告警,这样一来就大幅增加了黑灰产的利用成本
STS Token层面
既然黑灰产是通过获取STS Token来进行上传利用,那我们也可以从STS Token层面来入手,做如下考量:
- 首先是获取STS Token的接口,为了防止该接口被滥用,需要接入风控,异常调用则触发业务告警
- 其次,虽然STS Token限制了有效期,但仍需要对其增加限制,比如客户端获取STS Token时需要增加一个
fileName参数,并且使用该Token固定只能上传这个指定的文件名,这样一来,不论多少次上传都只是覆盖同一文件,降低了风险