用户在私聊过程中产生的静态文件是否需要加访问权限?

2014-08-27 11:55:15 +08:00
 node
比如私聊过程中发送的声音、图片,上传到静态文件cdn后,客户端访问这些静态文件的时候,
1) 是给出文件在cdn上的url(用uuid命名文件)让它直接访问,
2) 还是给每个文件都在数据库里留档,关联到私聊的那两个用户,客户端通过访问自家服务器间接获取,访问的时候先鉴别是不是有访问权限的用户,是的话服务器再从cdn取来静态文件中转给客户端?

或者有没有更好的方法?大家都是怎么做的?
3487 次点击
所在节点    程序员
14 条回复
lsylsy2
2014-08-27 12:00:11 +08:00
可以给文件指定accesskey和过期时间,我记得七牛又拍两家都支持;
原理是将http://a.com/b.jpg变成
http://a.com/b.jpg?token=xxx&expire=yyy
yyy是时间戳,xxx是(时间戳、URL、一个秘密字符串)编码后做md5
“秘密字符串”在服务器之间共享
lsylsy2
2014-08-27 12:00:50 +08:00
然后服务器校验token合法并且当前时间没有超过expire就允许访问,否则返回403
lsylsy2
2014-08-27 12:02:37 +08:00
akfish
2014-08-27 12:06:05 +08:00
其实各种网盘神马的都是存着,MD5或者SHA1撸一遍存个hash,如果遇到别的用户传相同文件,直接拿来用了,自己省了存储空间和带宽,不明真相的用户还觉得速度飞快用户体验好。
akfish
2014-08-27 12:09:29 +08:00
好吧,好像理解错了。权限什么的就和那个hash值挂钩,文件本身不能直接暴露给用户,不然就露陷了,加个带expire的access key给用户访问。
gamexg
2014-08-27 13:02:52 +08:00
一直很好奇,利用网盘急速上传功能,上传时伪造文件的hash值,是不是能遍历网盘的所有文件?
Automan
2014-08-27 13:04:46 +08:00
@gamexg 遍历不可能,通过一个 hash 来下载固定的文件倒是有可能(像ed2k那样)
gamexg
2014-08-27 13:10:03 +08:00
@Automan 就是把所有的 hash 全遍历一遍,不知道能命中多少文件。
Automan
2014-08-27 13:15:28 +08:00
@gamexg hash怎么遍历。。。
akfish
2014-08-27 13:54:57 +08:00
@gamexg 以Git用40位SHA1 Hash表示文件为例,不考虑碰撞的话,能编码16^40=1.46*10^48个文件,目前全球人口70亿,假如每个人都能上网,都用同一个网盘,都上传不同的文件,也才7*10^9。
所以hash空间的使用率是相当低的,遍历成本级高,检索到有效文件的概率极低。
node
2014-08-27 14:03:35 +08:00
@lsylsy2 非常感谢啊!回答的这么详细
@akfish 也一并送上感谢

假如用expire的话,考虑到离线消息的情况,我现在是这么想的:
用户A发送静态文件消息给用户B的时候,服务端在cache里生成一个key为uuid的条目,在这个条目里记录文件在cdn上的url,然后把这个uuid作为真正的消息内容发给B,B的客户端收到消息后拿uuid去访问服务器,服务器取出url并算好过期时间生成签名,把带签名的url返回给B的客户端,同时删除cache里对应的条目

请问一下这种方法合适吗?
另外像这种瞬间完成的动作,expire的时间间隔有没有比较推荐的值?
lsylsy2
2014-08-27 15:37:37 +08:00
@node 一般还是要五分钟左右,因为你的服务器和CDN的服务器可能时间不准,而且移动用户的话信号不好完全有可能卡上那么几十秒。这是个坑……
lygmqkl
2014-08-27 16:30:55 +08:00
貌似用OAuth 2.0的model就可以解决。
node
2014-08-27 20:17:47 +08:00
@lsylsy2 嗯,那我就设成5分钟


@lygmqkl 能讲一下具体是对哪个环节进行oauth2吗?感觉涉及到用户认证的话还是得在数据库里给文件名留档,那样的话就稍显繁琐了

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

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

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

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

© 2021 V2EX