4

当试图提出这个问题时,我得到了这个问题,正在使用 Java,并且在答案中它给出了一个 Ruby 示例,并且似乎注入仅在使用 Json 时发生?因为我有一个公开内容,我将尝试在 NoSQL 和 SQL 之间进行比较,我想说的是:开心,nosql 没有 sql 注入,因为它不是 sql ......

你能解释一下吗:

  • 使用 Python 驱动程序 (pymongo) 时如何发生 sql 注入。
  • 如何避免它。
  • 使用登录表单中的注释使用旧方式 sql 注入的比较。
4

2 回答 2

9

MongoDB 中的注入有几个问题:

  • $whereJS 注入 - 从用户输入构建 JavaScript 函数可能会导致查询的行为与您的预期不同。JavaScript 函数通常不是编写 MongoDB 查询的可靠方法,除非绝对需要,否则强烈建议不要使用它们。
  • 运算符注入 - 如果您允许用户(从前面)构建 a$or或其他东西,他们可以轻松地操纵这种能力来更改您的查询。如果您只是从一组文本字段中获取数据并从该数据手动构建,这当然不适用$or
  • JSON 注入 - 最近有相当多的人一直在尝试将从某些客户端源发送的完整 JSON 文档(讽刺的是,这是在 JAVA 中首次看到的)转换为插入 MongoDB 的文档。我什至不需要解释为什么这很糟糕。字段的 JSON 值很好,因为当然,MongoDB 是 BSON。

正如@Burhan 所说,注入来自没有经过消毒的输入。幸运的是 MongoDB 它有面向对象的查询。

SQL注入的问题来自“SQL”这个词。SQL 是一种由字符串组成的查询语言。另一方面,MongoDB 实际上使用 BSON 文档来指定查询(对象)。如果您遵守我在上面给您的基本常识规则,那么您应该永远不会遇到以下攻击向量的问题:

SELECT * FROM tbl_user WHERE ='';DROP TABLE;

此外,MongoDB 仅支持每个命令 atm 一个操作(不使用eval,但永远不要这样做),所以无论如何这都行不通......

我应该补充一点,这不适用于仅数据验证注入。

于 2012-10-27T13:54:40.793 回答
3

SQL注入与数据库无关。这是一种允许执行任意 SQL 命令的漏洞,因为目标系统不会清理提供给 SQL 服务器的 SQL。

是否使用 NoSQL 并不重要。如果您有一个在 mongodb(或 couchdb,或 XYZ db)上运行的系统,并且您提供了一个用户可以输入记录的前端——并且您没有正确地转义和清理来自前端的输入;您对 SQL 注入持开放态度。

于 2012-10-27T10:30:05.487 回答