清理MongoDB输入
我正在写一个与MongoDB数据库交互的REST接口程序,想要实现搜索功能。我希望能把整个MongoDB的接口都暴露出来。其实我有两个问题,但它们是相关的,所以我把它们放在一起问:
- 用Python的json模块解码不可信的JSON数据安全吗?还是说像pickle模块那样,可能会导致任意代码执行?
- 把解码后的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的查询,除非你的用户都是可信的(也就是说,你直接控制的客户端,比如应用程序中的其他服务器或组件)。