也可参照http://blog.csdn.net/code41_codemonkey/article/details/37974651
在express中默认req对象是没有req.session这个属性的(res.session也没有)。经过中间件的处理,为其加上,才能访问到。
var express = require('express');
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var app = express();
var options = {
host: "127.0.0.1",
port: "6379",
ttl: 60 * 60 * 24 * 30, //Session的有效期为30天
};
// 此时req对象还没有session这个属性
app.use(session({
store: new RedisStore(options),
secret: 'express is powerful'
}));
// 经过中间件处理后,可以通过req.session访问session object。比如如果你在session中保存了session.userId,就可以根据userId查找用户的信息了。
req在经过session中间件的时候就会自动完成session的有效性验证、延期/重新颁发、以及对session中数据的获取了。
SessionId就如同请求者的身份证,一旦被攻击者恶意获得,攻击者便可以伪装成请求者对服务器发起请求,也就是我们经常听到的会话劫持(Session/Cookie Hijack)关于会话劫持的原理推荐大家去看这篇文章
基于上述实现方法的Session管理,我认为基本上可以排除
暴力破解SessionId
恶意植入固定SessionId
req.session.cookie 是sessionCookie
两种可能,因为uid的库基本上可以保证SessionId的随机性;而传递SessionId则依赖HTTP请求头中的Cookie信息而非URL,同时在用户登录立刻更换SessionId。
唯一的可能性来源于Session的监听,而对于这种攻击有效的两种防止办法是:
Https很多网站仅仅在Login的阶段使用Https防止用户的用户名、密码信息被监听者获取,但是随后的SessionId同样有可能被监听者获取而伪造登录者的身份信息。因此更加推荐的方式是所有的信息传递全部使用Https实现,这样即使监听着截获了信息也无法破解其中的内容。关于如何使用NodeJS建立一个HTTPS的server可以参考《HTTPS的原理和NodeJS的实现》 这篇文章
httpOnlyExpress在options中提供了httpOnly
的属性,此属性默认值为true
,这个属性保证了Cookie的信息不能够通过JavaScript脚本获取。