【问题标题】:Can you tell me if express-mongo-sanitize is working?你能告诉我 express-mongo-sanitize 是否有效吗?
【发布时间】:2021-10-22 22:40:48
【问题描述】:

我正在尝试为我不起眼的 MERN 网络应用程序设置一些安全中间件,我目前正在使用头盔和 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”:“”} 密码:'TestPassword'

所以 req.body 将是:

{

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

password: 'TestPassword'

}

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

【问题讨论】:

    标签: javascript mongodb security sql-injection mern


    【解决方案1】:

    据我了解,从调试和通过代码来看,它清理的键是键 = 值对的查询和具有 $ 或点的 post 参数中的任何潜在键。它还尝试清理请求正文和标头中的任何键。

    比如上面的前一个用户提供的json也不行。

    但 https://your-domain/?$user=json 会被清理为 user=json。

    它不会像您和我所期望的那样从参数的值中删除 $。我还在 github 上向创作者提出了一个问题,看看他说了什么。我认为安全风险是关键和价值。如果您不将密钥保存到 mongodb 而是保存值,这将没有任何好处。

    作为参考,它会检查以下 HTTP 部分以删除任何潜在的有害 $ 或 .

    ['body', 'params', 'headers', 'query'].forEach(function (key) ...

    【讨论】:

      【解决方案2】:

      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": "" }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多