用户在私聊过程中产生的静态文件是否需要加访问权限? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
node
V2EX    程序员

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

  •  
  •   node 2014-08-27 11:55:15 +08:00 4034 次点击
    这是一个创建于 4063 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如私聊过程中发送的声音、图片,上传到静态文件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     Solana     2744 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 11:55 PVG 19:55 LAX 04:55 JFK 07:55
    Do have faith in what you're doing.
    ubao 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