使用对象存储如何防止覆盖上传?

2019-12-11 16:48:32 +08:00
 lshero
使用 S3、OSS 这一类对象存储,如果选择客户端 web 端直传。生成了临时 token 给了用户某个 bucket 的写入权限,怎么样防止用户提交同名文件覆盖 bucket 中已有的文件?
3557 次点击
所在节点    问与答
18 条回复
xeaglex
2019-12-11 20:30:21 +08:00
先请求再上传?
rrfeng
2019-12-11 20:40:24 +08:00
上传有这个选项的。仔细查一下文档。
malusama
2019-12-11 21:05:58 +08:00
你生成 uuid 附在用户的文件名后面嘛
EileenJ
2019-12-11 21:53:49 +08:00
可以通过文件名获取元数据信息
optional
2019-12-11 22:05:27 +08:00
阿里云不行。 要么用 url 签名。
要么,把时间参数作为目录的一部分,每隔一段时间换一个目录。
huijiewei
2019-12-11 22:09:24 +08:00
${filename} 用随机字符串就是了
opengps
2019-12-11 22:25:00 +08:00
先获取一下,看看返回值,然后再上传。
不过我更建议本地维护一个文件列表数据库,只依赖厂商的接口用起来毕竟受一定约束了
lshero
2019-12-11 23:08:56 +08:00
@opengps
@huijiewei
@malusama
@xeaglex
目前用的是 GUID 作为文件名,主要是 web,客户端直传不经过业务服务器,所以如果恶意构造同名文件随机文件名也并没有啥用。

@rrfeng 上传只有 PutObject 方法里有 x-oss-forbid-overwrite 这个参数,但是由于用 RAM+STS 授权的话,token 需要暴露给前端授权也只有给与写入的权限,所以这个方法并不能解决前端恶意构建请求。

@optional
感觉只能用 PostObject 这种方式搞表单上传,但是浏览器和客户端的 SDK 基本就废了
009694
2019-12-11 23:15:12 +08:00
oss token 包含的路径授权是可以包含文件名的 只要限定到文件名之后 最多只能重复上传覆盖自己之前上传的文件
lshero
2019-12-11 23:34:17 +08:00
@009694 是在 policy 中 Resource 的指定到具体文件吗?我研究一下,谢谢。
optional
2019-12-12 00:08:46 +08:00
@009694
@lshero
指定文件名的是 url 签名。只能用 put 方式上传,不能分片和断点续传,只能传传小文件。
sts 有最小周期,一个 sts 一个文件太奢侈。
目前折衷方案就是一个 sts 周期对应一个随机目录,在有限的时间内允许被覆盖。
shanlan
2019-12-12 00:12:57 +08:00
参考下 SM.MS ,重复图片不能传并且会提示
rrfeng
2019-12-12 09:55:46 +08:00
你所谓的恶意请求是什么?
lshero
2019-12-12 10:46:25 +08:00
@rrfeng sts token 授权整个 bucket 后,利用 sts token 可以覆盖写授权目录内已经存在的文件
walkersz
2019-12-12 12:00:24 +08:00
sts token 授权单个文件,文件名指定 GUID
lshero
2019-12-12 12:44:05 +08:00
@walkersz 授权单个文件楼上也说了成本比较高尤其是客户端要上传多个文件到同一 bucket 中的时候,不过为了安全只能这么搞,要不然就是随机一个文件夹进行隔离
ooh
2019-12-12 12:45:55 +08:00
检查一下文件是否存在
mangoDB
2019-12-12 13:06:00 +08:00
研究一下 ACL 相关配置,应该可以通过设置 Deny 和 MODIFY 相关,实现”防篡改“。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/628055

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX