dan*_*iel 13 javascript javascript-injection mongoose mongodb node.js
如何防止JavaScript NoSQL注入MongoDB?
我正在开发一个Node.js应用程序,我正在将req.body一个json对象传递给mongoose模型的save函数.我认为幕后有保护措施,但事实并非如此.
Zan*_*non 24
Sushant的回答不正确.您需要了解MongoDB中的NoSQL注入.
示例(取自此处)
User.findOne({
"name" : req.params.name,
"password" : req.params.password
}, callback);
Run Code Online (Sandbox Code Playgroud)
如果req.params.password是{ $ne: 1 },则在不知道密码的情况下检索用户($ne意味着不等于1).
MongoDB驱动程序
你可以使用mongo-sanitize:
它会删除输入中以'$'开头的所有键,因此您可以将其传递给MongoDB,而无需担心恶意用户被覆盖.
var sanitize = require('mongo-sanitize');
var name = sanitize(req.params.name);
var password = sanitize(req.params.password);
User.findOne({
"name" : name,
"password" : password
}, callback);
Run Code Online (Sandbox Code Playgroud)
猫鼬司机
由于它遵循模式,如果密码是字符串字段,它将把对象转换{ $ne: 1 }为字符串,不会造成任何损坏.在这种情况下,您不需要清理,只需记住设置正确的架构.
虽然这篇文章已经过时,但我正在回答.
我知道三种方式.
第一:有一个多用途内容过滤器.还通过过滤方式提供MongoDB注入保护.
第二: mongo-sanitize,帮助清理mongodb查询以查询选择器注入.
第三:我在这里看到了这个可以应用于MongoDB的解决方案.它实现起来非常简单.仅使用escape()JavaScript的内置函数.
escape()将字符串转换为ascii代码.$ne转换成%24ne.
var privateKey = escape(req.params.privateKey);
App.findOne({ key: privateKey }, function (err, app) {
//do something here
}
Run Code Online (Sandbox Code Playgroud)
Sus*_*pta -3
注意 我的答案不正确。请参考其他答案。
--
当客户端程序在 MongoDB 中组装查询时,它会构建一个 BSON 对象,而不是字符串。因此传统的 SQL 注入攻击不成问题。
详细信息请参阅文档
更新
eval避免像这样可以执行任意JS的表达式。如果您从用户那里获取输入并运行eval类似的表达式而不清理输入,您可能会搞砸。正如 JoBu1324 所指出的, 、 和 等操作where允许mapReduce直接group执行 JS 表达式。
| 归档时间: |
|
| 查看次数: |
12572 次 |
| 最近记录: |