我正在尝试为我的小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了?请原谅我的无知,我正在学习。
3条答案
按热度按时间svdrlsy41#
express-mongo-sanitize所做的是对以美元符号开头的键进行消毒。
请尝试改为向其发送此对象:
insrf1ej2#
根据我的理解,通过调试和浏览代码,它清理的键是query & post参数的key=value对中任何可能的键,这些键带有$或一个点。它还试图清理请求的主体和头部中的任何键。
例如,即使是前面的用户提供的json也不会这样做。
但是https://your-domain/?$用户=json将被清理为用户=json。
它并没有像你和我所期望的那样从参数值中删除$。我也向创建者提出了一个关于github的问题,看看他会怎么说。我认为安全风险是针对键和值的。如果你不把键保存到mongodb而是保存值,这没有任何好处。
作为参考,它检查以下HTTP部分以删除任何潜在的有害$或。
['正文','参数','头','查询'].forEach(函数(键)...
oxcyiej73#
我认为@A10n给出的答案是正确的,所以看起来'express-mongo-sanitize'只是一个部分解决方案。我已经添加了我的快速解决方案来删除每个req.body/params对象中的花括号(这应该会削弱大多数NoSQL攻击),如下所示:
然后,在您的路线之前: