我看了一下NodeClub的源码,关于登录认证这部分我觉得是很有风险的。NodeClub作为一个开源程序,估计会有人图省事不会去修改session_secret
先看看生成认证Session代码:
function gen_session(user, res) {
var auth_token = encrypt(user._id + '\t' + user.name + '\t' + user.pass + '\t' + user.email, config.session_secret);
res.cookie(config.auth_cookie_name, auth_token, {path: '/', maxAge: 1000 * 60 * 60 * 24 * 30}); //cookie 有效期30天
}
这个代码有几个问题:
- 只要用户没修改密码和session secret,每次加密后结果其实是一样的,也就是用户每次登录后Cookie的值都是一样的,它是不会过期的,如果泄漏,那么就会被伪造,用户除了修改密码毫无办法。
- 加密使用的对称加密,如果session_secret泄密,那么Cookie的值会被解密。如果只是解密倒还是小事,关键会把用户的密码
user.pass
也看到,这很要命!虽然pass是md5之后的,但是md5并没有加上salt,所以有可能是会暴露一些信息的,因为只要密码一样,那么md5后的结果必然一样的。 - 如果session_secret泄密,那么可以加密结果直接伪造身份
建议:
- 登录后的Cookie加密时增加时间戳,保证每次登录后Cookie是不一样的,并且校验时根据时间戳判断过期
user.pass
不要放在加密内容里面- 提醒用户session_secret不修改导致的严重后果(最好是能安装时随机生成一个)