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

请问下 OSS 的上传安全性大家是怎么保证的啊

  •  
  •   intermole · 2019-09-27 14:10:44 +08:00 · 7443 次点击
    这是一个创建于 1876 天前的主题,其中的信息可能已经有所发展或是发生改变。

    oss 如果按照官网的最佳实践,是直接前端 js 直传 oss 的,那上传过程就完全绕开了自己的服务器,我都没办法知道图片是哪个用户上传的……那如果黑客拿到 STS 令牌以后,调用脚本疯狂上传,不是很快就把 oss 的容量耗光了啊,请问在直传这种场景里,有没有办法针对用户进行上传流量限制的?

    38 条回复    2020-02-23 23:36:35 +08:00
    b821025551b
        1
    b821025551b  
       2019-09-27 14:13:11 +08:00   ❤️ 1
    没做过直传,我都是上传自己服务器后再从服务器传。
    U2Fsd
        2
    U2Fsd  
       2019-09-27 14:14:09 +08:00   ❤️ 1
    服务端签名后直传,签名有过期时间的。

    在签名之前,可以对用户身份做校验。
    U2Fsd
        3
    U2Fsd  
       2019-09-27 14:15:04 +08:00
    @b821025551b #1

    这样太浪费服务器带宽了。
    intermole
        4
    intermole  
    OP
       2019-09-27 14:15:58 +08:00
    @U2Fsd 在申请的时候可以做校验,但是别人在这半小时里的上传行为我没法控制啊,而且他到底传了多少流量的图片,我也跟踪不到啊
    b821025551b
        5
    b821025551b  
       2019-09-27 14:16:04 +08:00
    @U2Fsd #3 上传入网带宽不限,服务器到 oss 又是内网
    lwp2070809
        6
    lwp2070809  
       2019-09-27 14:19:52 +08:00
    我没有使用过直传的方式, 都是前端先上传到服务器再上传 OSS. 阿里云 ECS 上行至少百兆, OSS 区域选择和 ECS 地域一致就可以走内网传输, 很少会有带宽瓶颈.
    U2Fsd
        7
    U2Fsd  
       2019-09-27 14:23:13 +08:00   ❤️ 1
    @intermole #4

    签名直传可以设置上传回调。OSS 会回调你的服务器,可以实时了解用户上传了什么文件。
    imdong
        8
    imdong  
       2019-09-27 14:23:25 +08:00   ❤️ 1
    看了下 oss 的文档,末尾确实有提到:



    https://help.aliyun.com/document_detail/31952.html#concept-xqh-2df-xdb

    如果有提供有限时间内,一次性授权是最优解。
    U2Fsd
        9
    U2Fsd  
       2019-09-27 14:25:18 +08:00
    @imdong #8

    你这个文档说的是下载控制。

    LZ 问的是上传控制。
    imdong
        10
    imdong  
       2019-09-27 14:25:32 +08:00
    使用在 URL 中签名的方式,会将你授权的数据在过期时间内曝露在互联网上,请预先评估使用风险。

    U2Fsd
        11
    U2Fsd  
       2019-09-27 14:26:52 +08:00   ❤️ 1
    服务端签名直传并设置上传回调
    https://help.aliyun.com/document_detail/31927.html
    raopeize
        12
    raopeize  
       2019-09-27 14:29:17 +08:00
    保证你 sts 服务的安全性。
    imdong
        13
    imdong  
       2019-09-27 14:31:29 +08:00
    @U2Fsd #9 在文档 对象存储 OSS > 开发指南 > 对象 /文件( Object ) > 上传文件( Object ) > 授权给第三方上传

    中有提到支持 URL 签名 和 临时访问凭证

    https://help.aliyun.com/document_detail/31852.html?spm=a2c4g.11186623.6.616.47d0510dXqYWAF

    而且现在很多 ECS 服务器(应用机)本身都是很低的带宽和硬盘。

    访问很多都是利用 CDN 之类的来实现的。

    一些有状态服务都是专门的服务器,而上传到服务器在应用机上处理,依然会占用一定的资源。

    如果有能力,直接前端传 OSS 确实是很优解(不考虑类似安全性问题的话)。
    intermole
        14
    intermole  
    OP
       2019-09-27 14:31:48 +08:00
    @U2Fsd 好的,谢谢
    intermole
        15
    intermole  
    OP
       2019-09-27 14:33:29 +08:00
    @imdong 收到,谢谢
    opengps
        16
    opengps  
       2019-09-27 14:36:30 +08:00
    1 楼的做法正确: https://www.opengps.cn/Blog/View.aspx?id=43
    服务器的上行带宽是不限速的(参考理论值:固定带宽上限 200M,按量付费上限 100M ),所以 OSS 传到服务器并不明显因为占用带宽导致的干扰其他使用
    opengps
        17
    opengps  
       2019-09-27 14:37:32 +08:00
    @opengps 换个概念。把上一句里的上行带宽替换成“服务器入带宽”,上下行我自己都经常混淆
    U2Fsd
        18
    U2Fsd  
       2019-09-27 14:39:42 +08:00
    @opengps #16

    emmm 如果大家都这么干的话。

    怪不得阿里云的 ECS 的 IO 性能会被玩的这么差。
    intermole
        19
    intermole  
    OP
       2019-09-27 14:39:45 +08:00
    @opengps 但是如果大量的 c 端用户先把图片上传到 ecs,再有 ecs 转发给 oss 的话,ecs 可能会成为性能瓶颈,压力会比较大
    intermole
        20
    intermole  
    OP
       2019-09-27 14:46:26 +08:00
    @U2Fsd 貌似有个致命的问题啊,我看了文档,这个回调是 js 来设置的,那如果黑客根本不从我前端走,自己直接用拿到的 sts 凭证调用阿里的 sdk,我根本限制不了他啊,我还是跟踪不了是这个黑客传的照片啊
    b821025551b
        21
    b821025551b  
       2019-09-27 14:50:09 +08:00
    @U2Fsd #18 蛤?
    walkersz
        22
    walkersz  
       2019-09-27 14:57:42 +08:00
    sts 要是能限制上传个数就好了
    opengps
        23
    opengps  
       2019-09-27 14:59:33 +08:00   ❤️ 1
    我本身就是做阿里云上云支持业务的,这种做法并没有什么不可取,反而更容易对传统项目做改造:不需要前端工作,后端少量文件做 oss 的 sdk 对接即可。
    @U2Fsd 这是网络 io 为主,硬盘 io 低是虚拟化系统的通病,不是因为这个做法的问题,更何况,作为用户买了服务,怎么用法已经不归阿里云的负责范围了
    @intermole 你说的情况已经需要做 SLB 负载均衡了,有了负载均衡从后端看跟单台没区别,不至于出现你说的瓶颈导致项目扩容受阻
    huijiewei
        24
    huijiewei  
       2019-09-27 15:13:00 +08:00
    后台获取签名给前端就是了
    U2Fsd
        25
    U2Fsd  
       2019-09-27 15:19:16 +08:00
    @intermole #20

    [JavaScript 客户端签名直传] 时,AccessKeyID 和 AcessKeySecret 会暴露。

    如果要直传就要用 [服务端签名直传] 。

    U2Fsd
        26
    U2Fsd  
       2019-09-27 15:21:15 +08:00
    @opengps #23

    文件上传到 ECS 的速度,和上传到 OSS 的速度一样快吗?
    newtype0092
        27
    newtype0092  
       2019-09-27 15:22:35 +08:00   ❤️ 1
    后台生成令牌给前端,前端拿着令牌去上传。
    你生成 STS 令牌是可以控制上传参数的,本次上传的文件允许的前缀或文件名,文件大小,是否可以覆盖都是你设置好的啊,黑客拿到令牌也只能按这个规则上传的。
    iyaozhen
        28
    iyaozhen  
       2019-09-27 15:33:20 +08:00
    还有个直传 OSS 的好处可以上传加速,不然用户到自己服务器跨地域比较慢
    mymx2
        29
    mymx2  
       2019-09-27 15:44:24 +08:00   ❤️ 1
    既然 oss 没办法做次数限制。那就设置令牌过期时间短一点。不做长时间的令牌,从服务器获取令牌的时候做次数限制。

    另外从 web 直传还要指定不同类型 Content-Type,用户可以直传 html。Content-Type 做了指定,用户想直传还要获取不同类型的令牌。

    web 端直传就是为了方便,安全性肯定不如服务端上传。
    qq73666
        30
    qq73666  
       2019-09-27 16:13:11 +08:00
    看官方文档啊,有鉴权的
    arthas2234
        31
    arthas2234  
       2019-09-27 16:30:42 +08:00
    OSS 我记得是可以绑定域名的
    raopeize
        32
    raopeize  
       2019-09-27 17:38:26 +08:00 via iPhone
    @mymx2 其实大部分做转发上传更不安全
    akira
        33
    akira  
       2019-09-27 18:05:08 +08:00
    与其担心容量,还不如担心下黑客刷下载刷到你们破产
    mangoDB
        34
    mangoDB  
       2019-09-27 19:29:56 +08:00   ❤️ 1
    你可以把生成 session token 的有效时间设置尽可能短一点。即使被别有用心的人拿到,也不会产生太大的影响,OSS 的后端肯定是有流控的,短时间内应该不会“刷爆“。
    stanzhou
        35
    stanzhou  
       2019-12-04 09:43:43 +08:00
    @akira 恶意刷流量这个是怎么解决的
    mailmac
        36
    mailmac  
       2019-12-26 17:15:10 +08:00
    我来喷一喷,阿里云 oss 的 STS 吧, 好用个 P, 一大堆没有完成的功能,支持的包,和文档都写的稀烂。 各种功能不支持。
    感觉就是一些管理功能不开放,恨不能大家,把什么东西都往里面塞,多下载点东西它才能赚流量的钱。
    还写的最佳实践。。。 臭不要脸。
    inktiger
        37
    inktiger  
       2020-02-23 19:07:03 +08:00   ❤️ 3
    这几天也在使用 oss,今天问了阿里技术人员,争对一系列大致做了这么几种流程处理方案

    争对这个要利用好两个东西,一个是回调,一个是 policy 参数

    我现在做的方法是让他一次签名只能上传一个文件,通过在 policy 里面设置 content-length-range(文件大小限制)和 key(文件路径),来控制用户的上传策略,如果严格一点还可以设置必须让用户上传的文件类型

    例如:
    content-length-range=524288 字节
    key=/user/logo/3f7a68dbfa984a189f80612343064f32.png

    在前端,用户也只能设置相同参数才能上传,不管黑客是怎么拿到的这个签名,他始终得保证,文件大小在 512kb 内,以及上传到 oss 最终的名称会是 /user/logo/3f7a68dbfa984a189f80612343064f32.png

    再者,为了防止黑客调用脚本疯狂上传,我觉得这个并不应该把他算在 oss 这边,首先,黑客要拿到签名,你为什么会给他呢?肯定是他是你网站的用户,在你程序没有 bug 的情况下,他是通过正常流程获取到的,争对你自己网站上的用户,你可以给他规定权限,比如这个用户他只有 1 个 G 的空间,在上传文件前其实我们能知道文件大小的,那么我们可以在获取签名的时候减去他的可上传空间,满足条件才给他下发签名

    至于如何做知道是哪个用户上传的,我觉得你可以在文件名上做手脚,比如用户 id 为 1,获取签名得到文件名值 3f7a68dbfa984a189f80612343064f32.png ,那么在下发的时候是否可以以文件名为 key,id 为 value 临时储存在 redis 来做一个关联呢,这样上传成功之后,通过 oss 的回调里的文件名参数,我们就能找到用户,这样肯定能判断具体是哪个用户上传的,如果还不能判断,那说明至少是程序这边出现了权限上的 bug,问题还是我们自己

    还有一个签名可以做一些小处理,比如一个签名可以规定 3 秒钟有效,其实这个也无所谓了,就算是 30 分钟过期,黑客拿着这个,他也只能局限在我们策略内的文件大小和文件名及特定格式操作,就算在这个签名内他连续上传,也只会是覆盖那同一张图片,所以造不成什么威胁,他就算在 30 分钟内上传 100 万张图片,也只玩的是那一张图片,512kb,一直做的覆盖操作,关键是,他请求的是阿里的服务器,oss 内 /外网流入流量是免费的我们更不需担心

    所以只要我们自己把关好自己系统这边的逻辑,直传这种方式我觉得是使用 oss 最好的方式,毕竟我实在不喜欢图片上传还要走一遍自己服务器
    inktiger
        38
    inktiger  
       2020-02-23 23:36:35 +08:00
    另外忘说了,还有一个东西,用 callback 回调参数来做用户安全验证也是可以的,把需要 oss 回调返给你的东西全部放在 callbackBody 这个字段里
    如:
    filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}&userId=5&companyId=100
    这样,上传成功了的话,oss 会回调你的接口,把上面的数据像文件名用户 id,公司 id,图片大小等各种结果返回给你

    另外,切记,callback 这个参数需要把他放在 policy 里进行生成签名,不然,如果有恶意操作的用户在前端请求的时候,可以修改 callback 的值的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:30 · PVG 16:30 · LAX 00:30 · JFK 03:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.