Python eval安全案例
Posted June 13, 2017
关于Python的eval函数, 大家一致的避免使用。 但有时候必须使用, 怎么保证安全呢? 下面我用一个案例来避免eval潜在的风险。 当然这只是其中的一种。
我的使用场景是这样的, 要把mongodb中的输出bson类型转换成JSON。 我需要转换的JSON是这样的, 看样子是个map类型, 但不是JSON类型, 确切的说他是bson类型。
以上我们需要在作用域中有ObjectId对象, 和ISODate对象, 来分别做两个类型的实例化。 实例化后再通过json.dumps转换为JSON字符串. 所以我想到了eval, 把ObjectId和ISODate分别创建对应的函数.
为了安全考虑,对eval的globals参数中的__builtins__
设置为空, 避免掉使用所有内置函数, 然后通过eval第三个参数locals进行实现白名单的机制(safe_map安全映射)。
通过以上的to_python
函数转换字符串到python实例. 在通过json.dumps
转换json字符串, 然后就可以得到以下结果.