清理MongoDB输入

4 投票
1 回答
4463 浏览
提问于 2025-04-17 01:10

我正在写一个与MongoDB数据库交互的REST接口程序,想要实现搜索功能。我希望能把整个MongoDB的接口都暴露出来。其实我有两个问题,但它们是相关的,所以我把它们放在一起问:

  1. 用Python的json模块解码不可信的JSON数据安全吗?还是说像pickle模块那样,可能会导致任意代码执行?
  2. 把解码后的JSON传给PyMongo的find()函数安全吗?

1 个回答

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的查询,除非你的用户都是可信的(也就是说,你直接控制的客户端,比如应用程序中的其他服务器或组件)。

撰写回答