如何安全地使用Passport与Node.js和MongoDB?

时间:2014-08-19 15:52:17

标签: node.js mongodb security http-headers passport.js

所以我已经让Passport使用Node.js和MongoDB进行会话管理,这当然可以方便地访问请求头中的user对象。但是,至少对我来说,Passport将此对象设置为MongoDB中的整个帐户文档。对于我创建的模式,这包括有关用户的所有内容 - 电子邮件,姓名,哈希和盐渍密码等。所以我有两个问题。

首先,一遍又一遍地在服务器和客户端之间来回发送所有信息真的很安全吗?当然它是通过SSL发送的,密码是哈希和盐渍的 - 但所有的用户信息仍在那里。我的架构是否需要将用户信息(身份验证不需要的个人信息)保存在不同的MongoDB文档中?即使我这样做,哈希密码仍然会来回传递。是否假设SSL阻止数据被窃听?看起来如果有人假设设法将每个发送到我的应用程序的标题吸收,他们就可以重新创建用户数据库并执行彩虹表攻击。

其次,在服务器端,我(天真地?)一直在使用请求标头用户名元素(req.user.username)来确定哪个用户已连接和验证。但是,似乎如果用户只是将其标题更改为不同的用户名,我的代码将允许他们伪装成不同的用户。那么我应该通过其他方式验证请求的身份,而不是仅仅使用可用的明文用户名?或者我是否完全忽略了这些标头的存储,生成和传递方式,这实际上不是安全问题?如果是这样 - 有人可以详细说明如何从Passport实际创建这些头文件吗?

1 个答案:

答案 0 :(得分:1)

对于你的第一个问题,不,将所有内容(包括密码哈希)发送给用户是不行的,这会打败它的目的,正如你所说的那样,一旦你有人拥有哈希,就会容易得多进行蛮力攻击(你没有从你的应用程序中删除那些数据)

至于第二个问题,你应该有一些中间件或插件来验证请求中存在的cookie实际上是否有效并且由你首先生成,可以使用req.user.username进行授权在您验证用户之前已在系统中进行过身份验证后(通过cookie)

中的路径句柄

请务必查看此博客文章,了解如何构建安全快速应用https://blog.liftsecurity.io/2012/12/07/writing-secure-express-js-apps,但如果您仍在考虑使用哪个框架,我会看看Hapijs及其用于身份验证的铃声插件{ {3}}保持会话。

祝你好运! :)