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

2014-07-26 21:34:49 +08:00
 serenader
一直搞不懂 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()

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

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

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

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

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

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

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

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

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

https://github.com/albin3/Node_Express_Redis_Session
rexren
2014-08-24 06:07:37 +08:00
@pp3182429 ```express-session``` 本身就支持用redis作为session store.. https://github.com/expressjs/session

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

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

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

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

© 2021 V2EX