mongodb 你能告诉我“快速蒙戈消毒”是否有效吗?

hfsqlsce  于 2022-11-28  发布在  Go
关注(0)|答案(3)|浏览(135)

我正在尝试为我的小MERN web应用程序设置一些安全中间件,我目前正在使用helmet和express-mongo-sanitize,专门用于防止NoSQL注入攻击。
但是,我已经在server.js文件中对其进行了如下设置:

const express = require('express')
const helmet = require('helmet')
const mongoSanitize = require('express-mongo-sanitize')

...

app.use(mongoSanitize())
app.use(helmet())

// Routes below

...

我试着做了一个模拟签名来测试它,比如:

用户名:{"$gt”:“"}密码:'测试密码'

因此请求主体将是:

{

username: '{"$gt": ""}',

password: 'TestPassword'

}

但是express-mongo-sanitize似乎没有捕捉到它,它进入了我的数据库。我是不是误解了什么?用户名键的值是一个字符串,所以也许它已经OK了?请原谅我的无知,我正在学习。

svdrlsy4

svdrlsy41#

express-mongo-sanitize所做的是对以美元符号开头的键进行消毒。

username: '{"$gt": ""}' --> this isn't a key starting with a dollar sign. Rather, the value of username is just a string.

请尝试改为向其发送此对象:

{

"username": { "$gt": "" }

}
insrf1ej

insrf1ej2#

根据我的理解,通过调试和浏览代码,它清理的键是query & post参数的key=value对中任何可能的键,这些键带有$或一个点。它还试图清理请求的主体和头部中的任何键。
例如,即使是前面的用户提供的json也不会这样做。
但是https://your-domain/?$用户=json将被清理为用户=json。
它并没有像你和我所期望的那样从参数值中删除$。我也向创建者提出了一个关于github的问题,看看他会怎么说。我认为安全风险是针对键和值的。如果你不把键保存到mongodb而是保存值,这没有任何好处。
作为参考,它检查以下HTTP部分以删除任何潜在的有害$或。
['正文','参数','头','查询'].forEach(函数(键)...

oxcyiej7

oxcyiej73#

我认为@A10n给出的答案是正确的,所以看起来'express-mongo-sanitize'只是一个部分解决方案。我已经添加了我的快速解决方案来删除每个req.body/params对象中的花括号(这应该会削弱大多数NoSQL攻击),如下所示:

// Middleware that replaces all {} symbols with [] to prevent NoSQL attack
    const removeCurlies = (req, res, next) => {
      Object.keys(req.body).forEach((key) => {
        req.body[key] = _.replace(req.body[key], "{", "[");
        req.body[key] = _.replace(req.body[key], "}", "]");
      });
      Object.keys(req.params).forEach((key) => {
        req.params[key] = _.replace(req.params[key], "{", "[");
        req.params[key] = _.replace(req.params[key], "}", "]");
      });
      next();
    };

然后,在您的路线之前:

app.use(removeCurlies);

相关问题