2012-10-27 31 views
3

当试图提出这个问题时,我得到了this one它使用Java,并且在答案中给出了一个Ruby示例,并且似乎注入仅在使用Json时才会发生?因为我一个暴露在那里我会尽力的NoSQL和SQL之间的比较,我试图说:快乐的NoSQL没有SQL注入,因为它不是SQL ...Python中的NoSql Injection

可以请您给我解释一下:

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

回答

7

有几个与注射关注MongoDB中:

  • $where JS注射 - 根据用户输入大厦JavaScript函数可以导致能表现不同,以你所期望的查询。一般来说JavaScript函数并不是负责编写MongoDB查询的方法,强烈建议不要使用它们,除非绝对需要。
  • 操作员注入 - 如果你允许用户从前面建立一个$or或者他们可以很容易地操纵这个能力来改变你的查询。如果您仅从一组文本字段获取数据并从该数据手动构建$or,则这当然不适用。
  • JSON注入 - 最近有不少人一直试图将一个完整的JSON文档(讽刺的是,在JAVA中看到这一点)从一些客户端源文件转换为一个文档插入到MongoDB中。我甚至不需要去探讨为什么这是不好的。一个字段的JSON值是好的,因为当然,MongoDB是BSON。

作为@Burhan声明注射来自没有消毒输入。幸运的是,MongoDB具有面向对象的查询功能。

SQL注入的问题来自单词“SQL”。 SQL是一个由字符串组成的查询语言。另一方面,MongoDB实际上使用BSON文档来指定查询(一个对象)。如果你保持基本的常识规则,我给你上面你永远不应该有一个问题,类似的攻击向量:

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

而且MongoDB中仅支持每个命令大气压(一个操作,而无需使用eval,永远不要尽管如此),所以这将无法正常工作...

我应该补充说,这不适用于数据验证唯一注射。

+0

好答案+1。 –

+0

啊!现在我看到:D 谢谢你们俩:) –

3

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

如果您使用NoSQL或不使用它,这并不重要。如果您有一个运行在mongodb(或couchdb或XYZ db)上的系统,并且您提供了一个用户可以输入记录的前端 - 并且您不能正确地转义和清理来自前端的输入;你已经开放SQL注入。

+0

所以解决方案只是使用字符转义?所以这是一个python(框架,这里是Tornado)工作来保护这个? –

+2

作为一名程序员,您需要了解SQL注入的工作,并确保您编写的代码不易受到攻击。大多数ORM库会提供这种“开箱即用”的功能,但如果您不知道如何实现它,您仍然可以编写易受漏洞攻击的代码。对于记录,Tornado不提供任何开箱即用的功能,因为它没有捆绑ORM /自定义数据库层。 –

+0

龙卷风提供逃逸角色,是否足够? –