Python中的NoSql注入

4
当我尝试提出这个问题时,我得到了这个,它是使用Java编写的,在答案中给出了一个Ruby示例,似乎只有在使用Json时才会发生注入?因为我有一个暴露,我将尝试比较NoSQL和SQL,并且我正在尝试说:高兴,NoSQL没有SQL注入,因为它不是SQL... 请您解释一下:
  • 当使用Python驱动程序(pymongo)时,SQL注入是如何发生的。
  • 如何避免它。
  • 使用登录表单中的注释进行旧方式SQL注入的比较。
2个回答

9

在MongoDB中存在注入的几个问题:

  • $where JS注入 - 从用户输入构建JavaScript函数可能导致查询结果与预期不同。一般来说,使用JavaScript函数编程MongoDB查询并不是一个负责任的方法,除非必须使用。
  • 运算符注入 - 如果您允许用户自行构建$or等操作,则他们可以轻易地利用此功能更改您的查询。当然,如果您只是从一组文本字段中提取数据并手动构建$or,则不适用此规则。
  • JSON注入 - 最近有很多人试图将来自客户端源的完整JSON文档转换为插入MongoDB的文档(最先在JAVA中看到这种情况),我甚至不需要说明为什么这是不好的。一个字段的JSON值是可以接受的,因为MongoDB实际上是BSON。

正如@Burhan所述,注入来自未经过清理的输入。幸运的是,对于MongoDB,它具有面向对象的查询功能。

SQL注入的问题来自“SQL”这个单词。SQL是由字符串组成的查询语言。另一方面,MongoDB实际上使用BSON文档来指定查询(一个对象)。如果您遵循我上面给出的基本常识规则,您就不会遇到像这样的攻击向量:

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

此外,MongoDB目前仅支持每个命令执行一个操作(不使用eval,千万不要这样做),因此无论如何都不起作用...

需要补充的是,这不适用于数据验证,仅适用于注入。


3
SQL注入与数据库无关。它是一种漏洞类型,允许执行任意SQL命令,因为目标系统不会对提交给SQL服务器的SQL语句进行净化处理。
无论您是否使用NoSQL,都没有关系。如果您在mongodb(或couchdb,或XYZ db)上运行的系统,并提供了一个前端,用户可以输入记录,而您没有正确转义和清理来自前端的输入,则开放了SQL注入漏洞。

那么解决方案只能使用字符转义吗?这意味着Python(框架,这里是Tornado)需要保护它? - Abdelouahab Pp
2
作为程序员,你的工作就是要了解SQL注入,并确保你编写的代码不容易受到攻击。大多数ORM库都会提供这个功能,但如果你不知道如何实现它,你仍然可能编写出容易受攻击的代码。需要说明的是,Tornado并没有提供任何开箱即用的功能,因为它没有捆绑ORM/自定义数据库层。 - Burhan Khalid
Tornado提供了转义字符,这是否足够? - Abdelouahab Pp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接