V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
node
V2EX  ›  程序员

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

  •  
  •   node · 2014-08-27 11:55:15 +08:00 · 3433 次点击
    这是一个创建于 3527 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如私聊过程中发送的声音、图片,上传到静态文件cdn后,客户端访问这些静态文件的时候,
    1) 是给出文件在cdn上的url(用uuid命名文件)让它直接访问,
    2) 还是给每个文件都在数据库里留档,关联到私聊的那两个用户,客户端通过访问自家服务器间接获取,访问的时候先鉴别是不是有访问权限的用户,是的话服务器再从cdn取来静态文件中转给客户端?

    或者有没有更好的方法?大家都是怎么做的?
    14 条回复    2014-08-27 20:17:47 +08:00
    lsylsy2
        1
    lsylsy2  
       2014-08-27 12:00:11 +08:00   ❤️ 3
    可以给文件指定accesskey和过期时间,我记得七牛又拍两家都支持;
    原理是将http://a.com/b.jpg变成
    http://a.com/b.jpg?token=xxx&expire=yyy
    yyy是时间戳,xxx是(时间戳、URL、一个秘密字符串)编码后做md5
    “秘密字符串”在服务器之间共享
    lsylsy2
        2
    lsylsy2  
       2014-08-27 12:00:50 +08:00   ❤️ 1
    然后服务器校验token合法并且当前时间没有超过expire就允许访问,否则返回403
    akfish
        4
    akfish  
       2014-08-27 12:06:05 +08:00
    其实各种网盘神马的都是存着,MD5或者SHA1撸一遍存个hash,如果遇到别的用户传相同文件,直接拿来用了,自己省了存储空间和带宽,不明真相的用户还觉得速度飞快用户体验好。
    akfish
        5
    akfish  
       2014-08-27 12:09:29 +08:00   ❤️ 1
    好吧,好像理解错了。权限什么的就和那个hash值挂钩,文件本身不能直接暴露给用户,不然就露陷了,加个带expire的access key给用户访问。
    gamexg
        6
    gamexg  
       2014-08-27 13:02:52 +08:00
    一直很好奇,利用网盘急速上传功能,上传时伪造文件的hash值,是不是能遍历网盘的所有文件?
    Automan
        7
    Automan  
       2014-08-27 13:04:46 +08:00
    @gamexg 遍历不可能,通过一个 hash 来下载固定的文件倒是有可能(像ed2k那样)
    gamexg
        8
    gamexg  
       2014-08-27 13:10:03 +08:00
    @Automan 就是把所有的 hash 全遍历一遍,不知道能命中多少文件。
    Automan
        9
    Automan  
       2014-08-27 13:15:28 +08:00
    @gamexg hash怎么遍历。。。
    akfish
        10
    akfish  
       2014-08-27 13:54:57 +08:00   ❤️ 2
    @gamexg 以Git用40位SHA1 Hash表示文件为例,不考虑碰撞的话,能编码16^40=1.46*10^48个文件,目前全球人口70亿,假如每个人都能上网,都用同一个网盘,都上传不同的文件,也才7*10^9。
    所以hash空间的使用率是相当低的,遍历成本级高,检索到有效文件的概率极低。
    node
        11
    node  
    OP
       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
        12
    lsylsy2  
       2014-08-27 15:37:37 +08:00   ❤️ 1
    @node 一般还是要五分钟左右,因为你的服务器和CDN的服务器可能时间不准,而且移动用户的话信号不好完全有可能卡上那么几十秒。这是个坑……
    lygmqkl
        13
    lygmqkl  
       2014-08-27 16:30:55 +08:00
    貌似用OAuth 2.0的model就可以解决。
    node
        14
    node  
    OP
       2014-08-27 20:17:47 +08:00
    @lsylsy2 嗯,那我就设成5分钟


    @lygmqkl 能讲一下具体是对哪个环节进行oauth2吗?感觉涉及到用户认证的话还是得在数据库里给文件名留档,那样的话就稍显繁琐了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5406 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:30 · PVG 09:30 · LAX 18:30 · JFK 21:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.