MongoDB如何避免SQL注入混乱?
我正在阅读我的可靠O'Reilly书,并且遇到了一段关于Mongo如何避免SQL注入式漏洞的泥沼。
在我的内心里,我想我明白这一点。 如果将unsanitized的variables传递到查询中,那么它们不能通过UNION
, JOIN
,查询转换注释等方式来打破面向文档的查询结构。
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式。 文档详细介绍了这一点:
使用PHP mongoDB可能容易受到无SQL注入的影响:
http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/
数据库可能不会parsing内容,但是代码的其他部分易受攻击。
为了防止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的参数化查询 。