MongoDB如何避免SQL注入混乱?

时间:2011-02-16 19:58:23

标签: sql mongodb sql-injection

我正在阅读我信赖的O'Reilly书,并且发现了一篇关于Mongo本质上是如何避免SQL注入式漏洞的消息。

在我的直觉中,我想我理解这一点。如果将未经过身份验证的变量传递给查询,则它们不会突破面向文档的查询结构,其中包含UNIONJOIN,查询转换的注释等。

MongoDB如何避免SQL注入混乱?它只是本质上的查询语法吗?

5 个答案:

答案 0 :(得分:42)

MongoDB通过不解析来避免出现问题。

任何涉及在解析的格式化文本中编码用户数据的API,都有可能使调用者和被调用者不同意应该如何解析该文本。当数据被误解为元数据时,这些分歧可能是安全问题。无论您是在谈论printf格式字符串,包括HTML中的用户生成内容,还是生成SQL,都是如此。

由于MongoDB不解析结构化文本以确定要做什么,因此不可能将用户输入误解为指令,因此没有可能的安全漏洞。

顺便提一下,避免需要解析的API的建议是http://cr.yp.to/qmail/guarantee.html中的第5项。如果您对编写安全软件感兴趣,其他6条建议也值得关注。


更新(2018):我所知的原始答案仍然是我所知的最佳答案。从发送到MongoDB的内容到发回的内容,没有SQL注入攻击。我所知道的注入攻击发生在MongoDB之外,实际上是外部语言和库如何设置将传递给MongoDB的数据结构的问题。此外,漏洞的位置在于如何在成为数据结构的过程中解析数据。因此,原始答案准确地描述了如何避免注入攻击,以及使您面临风险的原因。

但对于那些因自己代码中不明显的缺陷而受到注入攻击的程序员而言,这种准确性是一种冷酷的安慰。我们很少有人区分外部工具和我们的代码与外部工具之间的所有层。而事实仍然是,我们需要保持警惕,以预测和关闭注射攻击。使用所有工具。在可预见的未来,情况仍将如此。

答案 1 :(得分:25)

总结MongoDB documentation

  

BSON

     

当客户端程序在MongoDB中组装一个查询时,它会构建一个   BSON对象,不是字符串。因此传统的SQL注入攻击是   不是问题。

但是,MongoDB不能免受注入攻击。如同一文档中所述,由于MongoDB操作允许在服务器上直接执行任意JavaScript表达式,因此仍然可以进行注入攻击。文档详细介绍了这一点:

http://docs.mongodb.org/manual/faq/developers/#javascript

答案 2 :(得分:17)

答案 3 :(得分:4)

数据库可能无法解析内容,但代码的其他区域容易受到攻击。

https://www.owasp.org/index.php/Testing_for_NoSQL_injection

答案 4 :(得分:4)

为了防止SQL注入,客户端可以使用MongoDB的语言API。这样,所有输入都是简单的值 - 无法注入命令。一个Java示例:

collection.find(Filters.eq("key", "input value"))

缺点是您无法轻松测试过滤器。你不能将它复制到Mongo的shell并进行测试。对于更大,更复杂的过滤器/查询尤其有问题。

BUT !!!还有一个不使用过滤器API的API - 可以解析任何json过滤器。下面的Java示例:

collection.find(BasicDBObject.parse("{key: "input value"}"));

这很好,因为你可以直接将过滤器复制到MongoDB shell来测试它。

BUT !!! (最后但是,我保证)这很容易注入NoSql。 Java示例,其中输入值为{$gt: ""}

collection.find(BasicDBObject.parse("{key: {$gt: ""}}"));

在最后一个示例中,返回所有内容,即使我们只是为了返回特定记录。

直接使用过滤器时,请参阅here有关SQL注入的更全面说明。

最后一件事。我认为有一种方法可以使用两个原始过滤器并仍然可以防止SQL注入。例如,在Java中,我们可以使用Jongo's parameterized queries