MongoDB如何避免SQL注入混乱?

我正在阅读我的可靠O'Reilly书,并且遇到了一段关于Mongo如何避免SQL注入式漏洞的泥沼。

在我的内心里,我想我明白这一点。 如果将unsanitized的variables传递到查询中,那么它们不能通过UNIONJOIN ,查询转换注释等方式来打破面向文档的查询结构。

MongoDB如何避免SQL注入混乱? 这是查询语法的性质吗?

MongoDB通过不parsing避免了潜在的问题。

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

由于MongoDB没有parsing结构化文本来找出做什么,所以不可能将用户input误解为指令,因此没有可能的安全漏洞。

顺便提一下,避免需要parsing的API的build议是http://cr.yp.to/qmail/guarantee.html中的第; 5项。 如果你有兴趣编写安全的软件,其他6个build议值得一看。

总结MongoDB 文档

BSON

当客户端程序在MongoDB中组装一个查询时,它会build立一个BSON对象,而不是一个string。 因此传统的SQL注入攻击不成问题。

但是,MongoDB并不能抵抗注入攻击 。 正如在同一个文档中指出的那样,注入攻击仍然是可能的,因为MongoDB操作允许在服务器上直接执行任意JavaScriptexpression式。 文档详细介绍了这一点:

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

数据库可能不会parsing内容,但是代码的其他部分易受攻击。

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

为了防止SQL注入,客户端可以使用MongoDB的语言API。 这样,所有的input都是简单的值 – 命令不能被注入。 一个Java的例子:

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

缺点是你不能轻易testing你的filter。 你不能将它复制到Mongo的shell并testing它。 特别是对更大,更复杂的filter/查询有问题。

但!!! 还有一个API不使用filter的API – 使parsing任何JSONfilter。 Java示例如下:

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

这很好,因为您可以直接将filter复制到MongoDBshell进行testing。

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

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

在这最后一个例子中,即使我们仅仅意味着要返回特定的logging,也会返回所有内容。

当直接使用filter时,请参阅这里了解有关SQL注入的更全面的解释。

最后一件事。 我认为有一种方法可以使用两个原始的filter,并仍然防止SQL注入。 例如,在Java中,我们可以使用Jongo的参数化查询 。