你能告诉我 express-mongo-sanitize 是不是有效吗?

Posted

技术标签:

【中文标题】你能告诉我 express-mongo-sanitize 是不是有效吗?【英文标题】: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 似乎没有捕捉到它,它会进入我的数据库。我是不是误会了什么?用户名键的值是一个字符串,所以也许它已经可以了?请原谅我的无知,我正在学习。

【问题讨论】:

【参考方案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": "" 


【讨论】:

以上是关于你能告诉我 express-mongo-sanitize 是不是有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

仅在 Facebook 分享中出现问题....你能告诉我哪里出错了吗?

你能告诉我这个 Cohen-Sutherland 算法的实现有啥问题吗?

你能告诉我而不是python中的反斜杠“\”,还有其他可能性吗? [复制]

你能告诉我他们的代码之间是不是有任何区别。如果他们是,那么背后的原因是啥? [关闭]

你能告诉我PHP中的这个谷歌驱动API调用函数有啥问题吗

你能告诉 php 服务器中止以前运行的脚本的执行吗?