消除对MongoDB的输入

时间:2011-09-02 00:53:33

标签: python json mongodb code-injection pymongo

我正在为MongoDB数据库程序编写REST接口,我正在尝试实现搜索功能。我想公开整个MongoDB接口。我有两个问题,但是它们是相关的所以我将它们放在一个帖子中:

  1. 使用Python json模块解码不受信任的JSON是否安全,或者它是否像pickle模块一样可以允许任意代码执行?
  2. 将解码后的JSON传递给PyMongo find()函数是否安全?

1 个答案:

答案 0 :(得分: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的查询,除非您的用户都是可信任的(即您直接控制的客户端,例如应用程序中的其他服务器/组件)