2011-09-02 48 views
4

我正在为MongoDB数据库程序编写REST接口,并试图实现搜索功能。我想公开整个MongoDB接口。我有两个问题,真的,但他们有关的,所以我把它们放在一个帖子:对MongoDB的输入进行消毒

  1. 它是安全的不信任JSON使用Python JSON模块进行解码,或者是像在泡菜模块它可能允许任意代码执行?
  2. 将解码的JSON传递给PyMongo find()函数是否安全?

回答

6

Python的JSON模块应该是安全与不受信任的输入使用,至少在其默认配置(即你没有提供的任何自定义的解码器,这有可能在其中有漏洞)。

但是,我们不能肯定地说json.loads()的结果是安全的传递给pymongo的find()方法。虽然find()方法不会修改(更新或删除)中的mongodb数据,所以能够手艺有意很差执行查询,就像它使用特制$where子句创建非常差的性能特征如下:

{"$where": "function() { for (var i=0; i<1000000; i++) {}; return true; }"} 

请注意,这是有效的JSON和有效的mongodb查询。由于这个原因,我不会允许用户制作的JSON直接用作针对mongodb的查询,除非您的用户都是可信的(即您直接控制的客户端,例如应用程序中的其他服务器/组件)。

+0

你能给出Java和Scala相同的答案吗? – Jus12

+0

我认为同样的逻辑适用于任何语言或框架;有一些输入会导致MongoDB服务器(如上面的$ where这个例子)的不良行为,因此,通常将未经验证的未经验证的输入直接从最终用户传递到数据库一个坏主意,如果可以避免的话。清理用户输入的最好方法是使用表单验证库和一组(递归?)算法将验证后的表单对象转换为MongoDB文档(例如Python中的dict),以便查询/更新/插入/等等 – dcrosta

+0

谢谢。我正在尝试制作一个可以自动检测这种“不良图案”的工具。因此,我需要一个全面的例子列表。 – Jus12