请问下 OSS 的上传安全性大家是怎么保证的啊 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
intermole
V2EX    问与答

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

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

    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   span class="small fade"> 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     Solana     1247 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitue
    VERSION: 3.9.8.5 28ms UTC 17:20 PVG 01:20 LAX 10:20 JFK 13:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86