了解Passport.js – 篡改serializedUser

我试图绕过passport.js ,并确定我没有正确使用它。

特别是使用serializeUser()deserializeUser()函数。 我的function看起来类似于下面的两个。 我本质上推动我的数据库user._id进入会议(我不喜欢做),并可以在浏览器中用cookie查看器轻松查看它。

 passport.serializeUser(function(user, done) { done(null, user._id); }); passport.deserializeUser(function(id, done) { done(null, id); }); 

因此,对于每一个安全的请求,我运行一个isAuthenticated()函数来检查用户是否使用Passport进行身份validation,然后使用req.user的反序列化ID来对数据库执行各种CRUD操作。

我想知道的是什么会阻止已authentication的用户将其自己的user._idreplace为会话中的其他用户的user._id,并获得所有这些不同用户的CRUD数据库操作的访问权限。

  • 护照是否有某种哈希algorithm来检查序列化数据是否被篡改?
  • 我不应该使用我的数据库CRUD操作返回的ID?
  • 有没有其他的方法来避免将user._id发送到浏览器?

  • 这是确保会话数据不被篡改的会话中间件,只需提供用于签名的秘密选项即可。

从快速会话中间件文档( https://github.com/expressjs/session

秘密会话cookie用这个秘密签名以防止篡改。

防爆。 app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))

序列化和反序列化逻辑由应用程序提供,允许应用程序select适当的数据库和/或对象映射器,而不需要由authentication层进行拼版。

所以,你必须实现serializeUser()和deserializeUser()方法。 Serialize方法将返回身份信息以在将来的请求中恢复用户。 这个身份信息将被保存在会话中。 反序列化方法应该能够根据该身份信息来识别用户。 无论您使用数据库ID,一些随机生成的string,UUID或类似的东西都取决于您和您的安全要求。