在这种情况下是否存在任何安全漏洞:
eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})
unsanitized_user_input
str 对象在哪里。该字符串是用户生成的,可能很讨厌。假设我们的 web 框架没有让我们失望,它是 Python 内置的一个真正诚实的 str 实例。
如果这很危险,我们可以对输入做任何事情以使其安全吗?
我们绝对不想执行字符串中包含的任何内容。
也可以看看:
(我认为)对这个问题不重要的更大背景是我们有成千上万的这样的:
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 读回内存。
Eval 从持久存储中反序列化字符串的速度比 pickle 和 simplejson 快得多。解释器是 Python 2.5,所以 json 和 ast 不可用。不允许使用 C 模块,并且不允许使用 cPickle。