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或用户代理不匹配的情况下随时注销。
- 在node.js(node-orm)中链接模型关系,就像在Rails中一样
- 节点Express Regex检测无效字符
- 为什么在Node.js中使用escape()时,MySQL不显示错误?
- 节点js在一个应用程序中使用express和restify
- 代理与nodejs
- JS正则expression式来分割string基于字符前面没有反斜杠
- 浏览器控制台错误:无法从“react / lib / ReactAddonsDOMDependencies.js”中find模块“react-dom / lib / ReactPerf”
- Express.jsforms处理和错误检查 – 正确的方法
- 使用Express JS .all()方法:检测哪个VERB被实际使用