V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
serenader
V2EX  ›  Node.js

请教 Express 中的 session 和 cookie 的安全问题

  •  
  •   serenader · 2014-07-26 21:34:49 +08:00 · 7451 次点击
    这是一个创建于 3778 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一直搞不懂 session 和 cookie。

    假如我用这样的方法判断用户的登录状态:


    - 使用 express-session 中间件处理 session

    - session 存储在服务器的 Mongodb 上

    - 当用户登录成功时, req.session.user = user //user 为从数据库读取的用户信息。

    - 当用户访问网站中的任意一个页面时,判断 req.session.user 是否存在。以此来判断用户是否已登录。当 req.session.user 存在时,
    req.session.cookie.expires = new Date(Date.now()+1000*60*30);
    req.session.cookie.maxAge = 1000*60*30

    - 当用户退出登录时, req.session.destroy()

    这样是否存在严重的安全问题?从安全方面来看,是否还可以进一步加强安全?对这方面不太了解,如果问题很低级还请多多谅解。
    15 条回复    2014-08-24 06:07:37 +08:00
    ss098
        1
    ss098  
       2014-07-26 23:05:00 +08:00
    Session 并不是最佳的验证用户的方案,性能偏低(虽然小应用无所谓啦),我使用的方法是

    在 Cookie 中将一个数组变成 JSON 加密存储到 Cookie 中,数组中存一些常用的资料,比如 用户名,uid,email 等等

    在访问每一个页面的时候解密这个 Cookie,得到每一个页面都需要用到的资料,避免了一次数据库查询。
    jarlyyn
        2
    jarlyyn  
       2014-07-27 01:46:19 +08:00
    @ss098
    express有session in cookie吧……
    个人感觉有些时候这个不是非常靠谱的做法
    ityao
        3
    ityao  
       2014-07-27 08:02:48 +08:00
    @ss098 多终端更新同一段需要在session中存储的消息呢?只依赖session信息就不能同步了, 我的做法是服务器端session只存储比较固定和稳定的数据,例如用户id
    vfasky
        4
    vfasky  
       2014-07-27 08:52:31 +08:00 via iPhone
    @ss098 这方案非常危险! 加密的结果存在本地,就存在破解的可能性,且因为结果在本地,你不能限制破解次数。

    只需成功解密一个cookie,理论上,是可以伪造任何数据!到时只能呵呵了。

    这种方案是得不偿失的!
    ss098
        5
    ss098  
       2014-07-27 08:53:55 +08:00 via Android
    @jarlyyn 抱歉我没有在生产环境中用过 NodeJS 对相关的类库不是很了解,是从 PHP 的思路出发的
    @ityao 使用 session 本身是没什么问题的,所以这样也是可以的
    ss098
        6
    ss098  
       2014-07-27 08:54:59 +08:00 via Android
    @vfasky 我自己的生产环境对加密密匙做了每日随机更新
    ss098
        7
    ss098  
       2014-07-27 08:57:56 +08:00 via Android
    @vfasky 确实存在你所说的危险,每日更新密匙会导致 Cookie 失效并不适用于大多数生产环境
    vfasky
        8
    vfasky  
       2014-07-27 09:03:45 +08:00 via iPhone
    @ss098 呵呵,那是不是会存在这种情况:
    一用户刚刚登陆成功,刚好遇到你的更新密匙时间,是不是又要重登一次?

    如果上面的情况成立,那换成支付场景会怎样?
    vfasky
        9
    vfasky  
       2014-07-27 09:07:08 +08:00 via iPhone   ❤️ 1
    @ss098 握爪^_^
    dong3580
        10
    dong3580  
       2014-07-27 10:07:57 +08:00 via Android
    我都是本地加密cookie,和服务器session某个字段对比,复杂的本地加密字段基本在短时间内破解不出来,所以只要能让他在一个月或者一两周破不出来,就已经达到了加密的目的了。
    rekey
        11
    rekey  
       2014-07-29 19:08:17 +08:00   ❤️ 1
    话说 LZ 不给 cookies 设置有效期,就直接每次访问都直接续期的么?
    serenader
        12
    serenader  
    OP
       2014-07-29 19:34:07 +08:00
    @rekey 又按错按钮了。。。

    没有,只是在 req.session 里面操作。

    其实我就是不懂这个 req.session 与 req.cookie 。

    话说,你觉得这两个应该怎样设置比较合理呢?
    rekey
        13
    rekey  
       2014-07-30 10:25:00 +08:00
    这个在我的角度真的只能你自己理解了。我觉得我知道但是我说不好。
    pp3182429
        14
    pp3182429  
       2014-07-30 16:59:26 +08:00
    最近刚做了个把session存在redis里的middleware,求拍砖。。

    https://github.com/albin3/Node_Express_Redis_Session
    rexren
        15
    rexren  
       2014-08-24 06:07:37 +08:00
    @pp3182429 ```express-session``` 本身就支持用redis作为session store.. https://github.com/expressjs/session
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3133 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:52 · PVG 21:52 · LAX 05:52 · JFK 08:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.