gpt4 book ai didi

node.js - 使用 Mongoose 缓解 MongoDB 注入(inject)攻击

转载 作者:可可西里 更新时间:2023-11-01 10:09:11 28 4
gpt4 key购买 nike

我正在使用 Mongoose ODM wrapper对于 NodeJS,我担心注入(inject)攻击。假设我有以下架构:

const UserSchema = new mongoose.Schema({ userName: String, password: String });

如果我要执行如下所示的登录请求:

router.post('/login', (request, response) => {

const userName = request.body.userName;
const password = request.body.password;

User.findOne({ userName: userName }, function (error, user) {
// ... check password, other logic
});
});

我愿意使用以下 JSON 负载进行注入(inject)攻击,它总能找到用户:

{
"email": { "$gte": "" },
"password": { "$gte": "" }
}

我不关心密码,因为如果发现用户会阻止任何实际登录,密码会被散列,但我想确保我的输入经过清理,这样攻击者甚至无法做到这一点。

我知道 mongo-sanitize NPM 包在类似 StackOverflow post 中引用这似乎删除了所有以“$”开头的 JSON 键。无论如何我都打算使用它,但我永远不会允许用户提交原始的、未解析的 JSON。在这种情况下,假设我进行了正确的 null 检查,只调用 userName 上的 toString() 是一种好习惯吗?

const userName = request.body.userName.toString();

这会避免执行查询,但感觉不太安全。我认为以下是更好的方法,因为它试图将 userName 转换为 String:

User.findOne({ userName: { "$eq": userName } }, function (error, user) {
// ... other logic
});

我在 Model.findOne() documentation 中找不到与此相关的任何信息这让我相信我忽略了一些东西。

如有任何见解,我们将不胜感激。

其他引用:

  1. https://blog.websecurify.com/2014/08/hacking-nodejs-and-mongodb.html
  2. https://ckarande.gitbooks.io/owasp-nodegoat-tutorial/content/tutorial/a1_-_sql_and_nosql_injection.html

最佳答案

虽然您可以使用 $eq 来确保在查询中使用相等比较,但您的快速路由处理程序是执行请求格式验证的更好位置。

有效的 POST/login 应该在请求正文中包含 userNamepassword 字符串字段。如果不是,它应该在到达 Mongoose 之前就被拒绝。

关于node.js - 使用 Mongoose 缓解 MongoDB 注入(inject)攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52707399/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com