oss 如果按照官网的最佳实践,是直接前端 js 直传 oss 的,那上传过程就完全绕开了自己的服务器,我都没办法知道图片是哪个用户上传的……那如果黑客拿到 STS 令牌以后,调用脚本疯狂上传,不是很快就把 oss 的容量耗光了啊,请问在直传这种场景里,有没有办法针对用户进行上传流量限制的?
1
b821025551b 2019-09-27 14:13:11 +08:00 1
没做过直传,我都是上传自己服务器后再从服务器传。
|
2
U2Fsd 2019-09-27 14:14:09 +08:00 1
服务端签名后直传,签名有过期时间的。
在签名之前,可以对用户身份做校验。 |
3
U2Fsd 2019-09-27 14:15:04 +08:00
|
4
intermole OP @U2Fsd 在申请的时候可以做校验,但是别人在这半小时里的上传行为我没法控制啊,而且他到底传了多少流量的图片,我也跟踪不到啊
|
5
b821025551b 2019-09-27 14:16:04 +08:00
@U2Fsd #3 上传入网带宽不限,服务器到 oss 又是内网
|
6
lwp2070809 2019-09-27 14:19:52 +08:00
我没有使用过直传的方式, 都是前端先上传到服务器再上传 OSS. 阿里云 ECS 上行至少百兆, OSS 区域选择和 ECS 地域一致就可以走内网传输, 很少会有带宽瓶颈.
|
8
imdong 2019-09-27 14:23:25 +08:00 1
看了下 oss 的文档,末尾确实有提到:
https://help.aliyun.com/document_detail/31952.html#concept-xqh-2df-xdb 如果有提供有限时间内,一次性授权是最优解。 |
10
imdong 2019-09-27 14:25:32 +08:00
使用在 URL 中签名的方式,会将你授权的数据在过期时间内曝露在互联网上,请预先评估使用风险。
|
11
U2Fsd 2019-09-27 14:26:52 +08:00 1
服务端签名直传并设置上传回调
https://help.aliyun.com/document_detail/31927.html |
12
raopeize 2019-09-27 14:29:17 +08:00
保证你 sts 服务的安全性。
|
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 确实是很优解(不考虑类似安全性问题的话)。 |
16
opengps 2019-09-27 14:36:30 +08:00
1 楼的做法正确: https://www.opengps.cn/Blog/View.aspx?id=43
服务器的上行带宽是不限速的(参考理论值:固定带宽上限 200M,按量付费上限 100M ),所以 OSS 传到服务器并不明显因为占用带宽导致的干扰其他使用 |
19
intermole OP @opengps 但是如果大量的 c 端用户先把图片上传到 ecs,再有 ecs 转发给 oss 的话,ecs 可能会成为性能瓶颈,压力会比较大
|
20
intermole OP @U2Fsd 貌似有个致命的问题啊,我看了文档,这个回调是 js 来设置的,那如果黑客根本不从我前端走,自己直接用拿到的 sts 凭证调用阿里的 sdk,我根本限制不了他啊,我还是跟踪不了是这个黑客传的照片啊
|
21
b821025551b 2019-09-27 14:50:09 +08:00
@U2Fsd #18 蛤?
|
22
walkersz 2019-09-27 14:57:42 +08:00
sts 要是能限制上传个数就好了
|
23
opengps 2019-09-27 14:59:33 +08:00 1
|
24
huijiewei 2019-09-27 15:13:00 +08:00
后台获取签名给前端就是了
|
25
U2Fsd 2019-09-27 15:19:16 +08:00
|
27
newtype0092 2019-09-27 15:22:35 +08:00 1
后台生成令牌给前端,前端拿着令牌去上传。
你生成 STS 令牌是可以控制上传参数的,本次上传的文件允许的前缀或文件名,文件大小,是否可以覆盖都是你设置好的啊,黑客拿到令牌也只能按这个规则上传的。 |
28
iyaozhen 2019-09-27 15:33:20 +08:00
还有个直传 OSS 的好处可以上传加速,不然用户到自己服务器跨地域比较慢
|
29
mymx2 2019-09-27 15:44:24 +08:00 1
既然 oss 没办法做次数限制。那就设置令牌过期时间短一点。不做长时间的令牌,从服务器获取令牌的时候做次数限制。
另外从 web 直传还要指定不同类型 Content-Type,用户可以直传 html。Content-Type 做了指定,用户想直传还要获取不同类型的令牌。 web 端直传就是为了方便,安全性肯定不如服务端上传。 |
30
qq73666 2019-09-27 16:13:11 +08:00
看官方文档啊,有鉴权的
|
31
arthas2234 2019-09-27 16:30:42 +08:00
OSS 我记得是可以绑定域名的
|
33
akira 2019-09-27 18:05:08 +08:00
与其担心容量,还不如担心下黑客刷下载刷到你们破产
|
34
mangoDB 2019-09-27 19:29:56 +08:00 1
你可以把生成 session token 的有效时间设置尽可能短一点。即使被别有用心的人拿到,也不会产生太大的影响,OSS 的后端肯定是有流控的,短时间内应该不会“刷爆“。
|
36
mailmac 2019-12-26 17:15:10 +08:00
我来喷一喷,阿里云 oss 的 STS 吧, 好用个 P, 一大堆没有完成的功能,支持的包,和文档都写的稀烂。 各种功能不支持。
感觉就是一些管理功能不开放,恨不能大家,把什么东西都往里面塞,多下载点东西它才能赚流量的钱。 还写的最佳实践。。。 臭不要脸。 |
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 最好的方式,毕竟我实在不喜欢图片上传还要走一遍自己服务器 |
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 的值的 |