【问题标题】:Which is a more reasonable way in mongodb?在mongodb中哪种方式更合理?
【发布时间】:2022-02-22 11:38:37
【问题描述】:

有两种检查登录的方法,它们都使用一次查询

let where = {
 username
};
//check username first
let result = await UserModel.findOne(where)
if (result != null) {
 if (result.password === password) {
  return done(null, result)
 } else {
  return done(null, false, 'wrong password')
 }
} else {
 return done(null, false, 'user does not exist')
}

let where = {
 username,
 password
};
//check username and password
let result = await UserModel.findOne(where)
if (result != null) { 
 return done(null, result)
} else {
 return done(null, false, 'wrong password or username')
}

哪个更好,为什么?谢谢。

【问题讨论】:

  • 您是将密码存储为纯字符串还是散列密码?
  • @cEeNiKc 散列密码。

标签: node.js mongodb


【解决方案1】:

问自己这个问题。

let query = {
   matchValue: "someValue",
   someValue: { $gt: 1 },
   someOtherValue: { $gte: 1 }
}

const results = await model.findOne(query)

if (results) // do something

let query = {
    matchValue: "someValue"
}

const results = await model.findOne(query);
if (results.someValue > 1 && results.someValue >== 1){
 ... do something.
}

如果可以通过 mongodb 进行检查(性能更高),为什么要在 javascript 中进行?

除了性能之外,您的两个逻辑都以相同的方式工作,并返回相同的结果。

无论结果如何(无效的用户名OR密码),对前端的响应应该始终是“无效的用户名/密码”

【讨论】:

    【解决方案2】:

    好吧,根据我的说法,您应该首先询问用户名,如果与数据库匹配,那么我们应该询问密码。如果您向用户询问用户名,则应尽快验证该用户。否则,用户可能会在他们的联系信息中打错字,然后花费大量时间使用您的服务,但在下次尝试登录时却发现没有与他们的信息匹配的帐户。这些帐户通常是孤立的并且在没有人工干预的情况下无法恢复。更糟糕的是,联系信息可能属于其他人,将帐户的完全控制权交给第三方。

    【讨论】:

    • 如果先验证用户名,是不是黑客可以借此判断数据库中有哪些用户名?
    • 至少,第二种方式保护了用户名,他们不知道用户名是否在数据库中,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多