express.js理解会话安全

时间:2014-01-13 20:22:24

标签: node.js session express

我无法理解有关express.js会话如何工作的一些观点

当我做

之类的事情
server.use express.cookieParser()
server.use express.cookieSession { secret: 'whatever' }

然后设置登录序列,如

server.post '/login', (req, res)->

  # checks that provided psw and username exist in db

  req.session.user =
    id: dbID
    username: postedUsername
    psw: postedPsw

  res.redirect '/'
所有参数都未加密,

是否安全req.session.user

我应该检查每个点的用户名和psw是否正确如下:

server.use (req, res, next) ->

  # checks that provided psw and username exist in db
  # otherwise destroy session

非常感谢你的时间

1 个答案:

答案 0 :(得分:2)

  

是req.session.user安全,所有参数都未加密吗?

当您使用{ secret: 'whatever' }时,您只是对cookie进行哈希处理,因为它存储在用户的浏览器中。这比在纯文本中保存值更好,但它不是非常安全(通常可以,因为你不应该在cookie中存储敏感信息)

您注意到,这些值会以纯文本格式从浏览器传输到您的应用。

如果您需要它们是安全的,最好的办法是使用HTTPS和证书。不要使用自己的“加密”,而是使用经过验证的协议(如HTTPS / SSL)

  

我应该检查每个点的用户名和psw是否正确如下:

通常,您只需要输入一次用户名/密码(在登录过程中),在数据库中检查一次(再次,在登录过程中),并发出您之后使用的“会话令牌”以验证会话来自有效用户。会话ID是你可以cookie的东西,因为它通常只持续几分钟(取决于你想要cookie的值多长时间)

验证会话的过程可能需要在每次点击服务器时执行,就像您考虑用户名/密码一样。有些人将会话ID存储在缓存数据库(或内存数据库)中,这样这个过程非常快,并且不会减慢用户的速度。

您可以在Express中创建“身份验证中间件”:

var authenticate = function(req, res, next) {

  if(req.cookies.sessionToken) {
    // call some method to validate the session)
    validateSession(req, res, next);
  }
  else {
    // Not authenticated (up to you what to do) 
    next();
  }

}

...然后在您的路线上共享此中间件:

app.get('/somethingA', authenticate, somethingA);
app.get('/somethingB', authenticate, somethingB);