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

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

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']; 

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

  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('/'); } 

这是安全的还是你看到有这样的风险? 我应该用另一种方式去做吗?

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

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

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