在这种情况下,是否存在任何可能发生安全漏洞的风险:
eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})
其中unsanitized_user_input
是一个字符串对象。该字符串由用户生成,可能很恶劣。假设我们的Web框架没有出现问题,那么它就是Python内置的一个真实的字符串实例。
如果这很危险,我们能否对输入做些什么来使其安全?
我们绝对不希望执行字符串中包含的任何内容。
另请参阅:
更大的上下文(我认为)与问题无关,我们有成千上万个这样的问题:
repr([unsanitized_user_input_1,
unsanitized_user_input_2,
unsanitized_user_input_3,
unsanitized_user_input_4,
...])
在某些情况下,需要嵌套:
repr([[unsanitized_user_input_1,
unsanitized_user_input_2],
[unsanitized_user_input_3,
unsanitized_user_input_4],
...])
这些值本身通过 repr()
转换为字符串,存储在持久化存储中,最终通过 eval 读取回内存。
与 pickle 和 simplejson 相比,eval 更快地对持久化存储中的字符串进行反序列化。解释器是 Python 2.5 版本,因此不可用 json 和 ast。不允许使用 C 模块,也不允许使用 cPickle。