V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lshero
V2EX  ›  问与答

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

  •  
  •   lshero · 2019-12-11 16:48:32 +08:00 · 3759 次点击
    这是一个创建于 1817 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用 S3、OSS 这一类对象存储,如果选择客户端 web 端直传。生成了临时 token 给了用户某个 bucket 的写入权限,怎么样防止用户提交同名文件覆盖 bucket 中已有的文件?
    18 条回复    2019-12-12 13:06:00 +08:00
    xeaglex
        1
    xeaglex  
       2019-12-11 20:30:21 +08:00 via Android
    先请求再上传?
    rrfeng
        2
    rrfeng  
       2019-12-11 20:40:24 +08:00 via Android
    上传有这个选项的。仔细查一下文档。
    malusama
        3
    malusama  
       2019-12-11 21:05:58 +08:00
    你生成 uuid 附在用户的文件名后面嘛
    EileenJ
        4
    EileenJ  
       2019-12-11 21:53:49 +08:00 via Android
    可以通过文件名获取元数据信息
    optional
        5
    optional  
       2019-12-11 22:05:27 +08:00 via iPhone   ❤️ 1
    阿里云不行。 要么用 url 签名。
    要么,把时间参数作为目录的一部分,每隔一段时间换一个目录。
    huijiewei
        6
    huijiewei  
       2019-12-11 22:09:24 +08:00
    ${filename} 用随机字符串就是了
    opengps
        7
    opengps  
       2019-12-11 22:25:00 +08:00 via Android
    先获取一下,看看返回值,然后再上传。
    不过我更建议本地维护一个文件列表数据库,只依赖厂商的接口用起来毕竟受一定约束了
    lshero
        8
    lshero  
    OP
       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
        9
    009694  
       2019-12-11 23:15:12 +08:00 via iPhone   ❤️ 1
    oss token 包含的路径授权是可以包含文件名的 只要限定到文件名之后 最多只能重复上传覆盖自己之前上传的文件
    lshero
        10
    lshero  
    OP
       2019-12-11 23:34:17 +08:00
    @009694 是在 policy 中 Resource 的指定到具体文件吗?我研究一下,谢谢。
    optional
        11
    optional  
       2019-12-12 00:08:46 +08:00 via iPhone   ❤️ 1
    @009694
    @lshero
    指定文件名的是 url 签名。只能用 put 方式上传,不能分片和断点续传,只能传传小文件。
    sts 有最小周期,一个 sts 一个文件太奢侈。
    目前折衷方案就是一个 sts 周期对应一个随机目录,在有限的时间内允许被覆盖。
    shanlan
        12
    shanlan  
       2019-12-12 00:12:57 +08:00
    参考下 SM.MS ,重复图片不能传并且会提示
    rrfeng
        13
    rrfeng  
       2019-12-12 09:55:46 +08:00 via Android
    你所谓的恶意请求是什么?
    lshero
        14
    lshero  
    OP
       2019-12-12 10:46:25 +08:00
    @rrfeng sts token 授权整个 bucket 后,利用 sts token 可以覆盖写授权目录内已经存在的文件
    walkersz
        15
    walkersz  
       2019-12-12 12:00:24 +08:00   ❤️ 1
    sts token 授权单个文件,文件名指定 GUID
    lshero
        16
    lshero  
    OP
       2019-12-12 12:44:05 +08:00
    @walkersz 授权单个文件楼上也说了成本比较高尤其是客户端要上传多个文件到同一 bucket 中的时候,不过为了安全只能这么搞,要不然就是随机一个文件夹进行隔离
    ooh
        17
    ooh  
       2019-12-12 12:45:55 +08:00
    检查一下文件是否存在
    mangoDB
        18
    mangoDB  
       2019-12-12 13:06:00 +08:00   ❤️ 1
    研究一下 ACL 相关配置,应该可以通过设置 Deny 和 MODIFY 相关,实现”防篡改“。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1052 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 18:32 · PVG 02:32 · LAX 10:32 · JFK 13:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.