【问题标题】:How to create a secure express.js + mongodb user authentication system如何创建一个安全的 express.js + mongodb 用户认证系统
【发布时间】:2014-03-04 18:15:17
【问题描述】:

我目前处于以下情况: 我使用以下技术创建了一个用户身份验证系统:
expressjs(使用会话和 cookie)
mysql(保留用户名和密码)
用于持久会话存储的 mongodb

目的是创建一个系统,将用户 ID 存储在 cookie 中,并基于该系统是否允许访问。

第一个问题。如果我正确理解会话是如何工作的,那么每次用户访问我的网站(登录或未登录)时,她/他将使用将存储在 req.sessionID 中的快速会话机制创建一个新的会话 ID。

现在的问题。在登录页面:
用户输入用户名/密码。
我向 mysql 服务器发出请求,确认用户名/密码。现在,根据我在网上找到的示例,进行简单用户身份验证的解决方案是执行以下操作:
req.session.user=用户名
然后稍后检查是否设置了 req.session.user,并在此基础上允许访问用户等。 但是,对于我的网站,用户的用户名是用户的电子邮件。将用户详细信息以纯文本形式存储在 cookie 值中是否安全,即使是出于身份验证目的?

还有哪些其他可用选项?我可以在使用 bcrypt 存储到数据库之前加密用户名并使用它吗?

提前致谢。

一个

【问题讨论】:

  • 生成您分配给 cookie 的会话 ID。在后端,您可以跟踪会话 ID 并随时将其过期。如果会话 ID 与您的后端存储的内容不匹配,则不会对其进行身份验证。如果您只是继续使用用户名或电子邮件,那么有什么办法可以防止某人使用其他人的用户名制作会话响应并且现在已通过他们的身份验证?您的服务器不知道什么是有效的,什么是无效的
  • 你的问题太宽泛了,但是看看 passeport.js 和 local-strategy,它会比你更好地为你处理这些东西。
  • @mpm - 我看过护照,但我发现自己实现一些更简单的东西更好,这也有助于我理解某些概念。
  • @devshorts - 好的,我明白了。还有一件事。我需要将生成的 sessionID 与后端的每个用户相关联吗?因此,在每个请求中,我都验证 sessionID 是否只是一个有效的,或者我是否需要一个包含用户名 - sessionID 的键值存储。
  • 您应该有一个键值存储,其中键是 sessionID,值是您想要该用户的任何相关元数据。

标签: node.js session express


【解决方案1】:
  1. 将会话 cookie 选项设置为 httpOnly 并将足够长的字符串传递给机密。
  2. 您的 req 对象不仅具有 sessionID 属性,还具有会话对象。此对象存储在 Mongo(或您传递以表达的任何会话存储)中,并且它的内容对您的客户端不可用。因此,您可以在此处安全地存储所需的任何信息。

在幕后 Express 检查会话密钥(客户端可用的会话的唯一部分,您可以证明 Chrome devtools 的此检查资源选项卡)与当前会话匹配。如果有人试图伪造会话密钥,Express 会注意到这一点。实际上,Express 使用 Connect 中间件,所以你可能想略读这个以了解更多细节http://www.senchalabs.org/connect/session.html

【讨论】:

  • 感谢您的回答。因此,如果我理解正确,connect.sid 的值与 req.session 中的值相同,express 用于确保会话不被篡改。但是 req.session 在客户端中不可用。所以正如你所说,我可以在那里安全地存储 req.session.user 之类的东西。但是,在 req.session.user 中存储诸如 id 之类的东西,而不是用户电子邮件、用户名或类似的东西不是更安全吗?
  • 好吧,如果有人获得了对 req.session 对象的访问权,那么他很有可能通过你在 session 中慷慨存储的 id 找到丢失的信息。所以我相信这不会提供任何额外的安全性,而是迫使您手动从数据库中提取电子邮件。但是我不是安全专家,所以这只是我的想法。
猜你喜欢
  • 1970-01-01
  • 2013-10-24
  • 2011-04-08
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多