目前,我的Express 3.0应用程序的身份验证中间件看起来像这样:
return function (req, res, next) {
if (!isProtected(req.path)) {
debug('Allowed path "' + req.path + '" --> calling next()');
next();
} else if (req.session.user != undefined) {
debug('User session detected --> calling next()');
next();
} else if (req.cookies.user != undefined && req.cookies.pass != undefined) {
var username = req.cookies.user;
var hash = req.cookies.pass;
debug('Cookies detected, authorizing...');
dbman.auth(username, hash, function (err, record) {
if (err) debug('Authorization error --> ' + err);
else if (!record) res.redirect(redirectPath);
else {
debug('Autologin successful, storing session data');
req.session.user = record;
next();
}
});
} else {
debug('Protected path -- No valid session or cookies were detected');
debug('redirecting to "' + redirectPath + '"');
res.redirect(redirectPath);
}
};
我的工作假设用户永远不会自己设置req.session
,并且req.session.user
只会在成功验证后设置。因此,如果会话存储中存在用户记录,我会让请求通过,甚至无需验证记录中存在的用户详细信息。但是当有cookie时,我会验证cookie中存在的哈希值。我是否需要验证会话记录,以免用户以某种方式操纵会话?
答案 0 :(得分:0)
Session只是你的内部数据结构 - 所以不,除非你提供会话操作的逻辑,否则用户无法做到这一点。 Express所做的是将加密的会话ID存储在用户cookie中,然后转换为存储在服务器上的会话对象。如果他知道加密密钥,用户只能操作会话对象ID - 他没有。