【问题标题】:How to use Passport with Node.js and MongoDB securely?如何安全地使用 Passport 与 Node.js 和 MongoDB?
【发布时间】:2014-08-19 15:52:16
【问题描述】:

所以我已经让 Passport 与 Node.js 和 MongoDB 一起用于会话管理,这当然可以方便地提供对请求标头中的 user 对象的访问。但是,至少对我来说,Passport 将此对象设置为来自 MongoDB 的整个帐户文档。对于我创建的架构,这包括有关用户的所有信息 - 电子邮件、姓名、散列和加盐密码等。所以我对此有两个问题。

首先,在服务器和客户端之间反复发送所有这些信息真的安全吗?当然它是通过 SSL 发送的,并且密码是经过哈希处理和加盐的——但所有用户信息仍然存在。我的架构是否应该将用户信息(身份验证不需要的个人信息)保存在不同的 MongoDB 文档中?即使我这样做了,散列密码仍然会来回传递。是否假设 SSL 可以防止该数据被窃听?似乎如果有人假设有人设法吸收了发送到我的应用程序的每个标头,他们就可以重新创建用户数据库并执行彩虹表攻击。

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

【问题讨论】:

  • 参见会话下的passportjs.org/guide/configure。您绝对不想公开这些数据,因为安全经验法则是只显示必要的内容。会话是为了隐藏这些东西。

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


【解决方案1】:

对于您的第一个问题,不,将所有内容(包括密码哈希)发送给用户是不行的,这将超出其目的,正如您所说,很好,一旦您有人拥有哈希,会容易得多进行蛮力攻击(您不会从您的应用程序中窃取数据)

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

请务必查看这篇关于如何构建安全快递应用程序的博客文章https://blog.liftsecurity.io/2012/12/07/writing-secure-express-js-apps,但如果您仍在考虑使用哪个框架,我会看看 Hapijs 及其用于身份验证的 bell 插件和https://github.com/hapijs/hapi-auth-cookie保持会话。

祝你好运! :)

【讨论】:

  • 谢谢,这很有帮助!这很奇怪,因为我遵循了 Passport 的基本示例(这似乎是一个广泛使用的中间件),并且该示例对其进行了设置,以便身份验证返回用户的 MongoDB 条目,包括他们的哈希密码,并将其设置为 req 中的用户标头目的。我确信有办法避免这种情况,奇怪的是他们的默认教程会导致如此明显的安全疏忽。
  • 示例只是示例 :) 开发人员有责任确保做出正确的软件工程决策。例如,如果您遵循第一个快速教程,您可能会得到一个 hello world 而不是真正的应用程序 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2018-09-22
  • 2016-06-19
  • 1970-01-01
  • 2020-11-20
  • 2016-01-20
相关资源
最近更新 更多