Nodejs Expressjs会话ip和浏览器代理匹配

时间:2012-05-25 14:10:47

标签: mysql node.js express

我使用connect-mysql-session在db中存储会话。现在我的问题是我如何添加包含浏览器代理和ip-adress的用户数据来检查会话是否有效?我如何获得该信息?我如何检查它是否匹配?

    users.login(credentials,function(err, results) {

  //On errors
  if (err) {
    res.render(routes.index, {
      title: 'Login'
    });

  //On success
  } else if (results[0]) {
    //Set session data and redirect to start page
    req.session.userdata = results[0];
    req.session.userdata.email = req.body.email_login;
    req.session.is_logged_in = true;
    res.redirect('/start');

  //Wrong credentials
  } else {
    req.flash('warning','Wrong password or login');
    res.render('index', {
      title: 'Login'
    });
  }
});

更新

我现在已将此添加到会话中:

req.session.ip = req.connection.remoteAddress;
req.session.useragent = req.headers['user-agent'];

并在我的身份验证中间件中检查它:

  if(req.session.userdata && req.session.is_logged_in === true && req.session.ip === req.connection.remoteAddress && req.session.useragent === req.headers['user-agent']) {
    next();
  } else {
    res.redirect('/');
  }

这是安全的还是您认为有任何风险?我应该采取另一种方式吗?

1 个答案:

答案 0 :(得分:1)

您的实施看起来不错,并且会为您提供一些非常基本的防止会话劫持的保护。

但是,我不确定我是否了解您的中间件。什么阻止用户直接请求/start?而且,更重要的是,当中间件拦截所有请求时,即使是/start的请求,这看起来不像是一些无限重定向循环吗?

我的建议只是考虑用户在ip或用户代理不匹配的情况下随时注销。