【发布时间】:2009-07-11 01:25:19
【问题描述】:
在这种情况下是否可能发生任何安全漏洞:
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。
【问题讨论】:
-
"如果我提出更大的背景,这样做的原因会更有意义" 你能详细说明这个问题吗?目前,该命令似乎毫无意义——就像对
unsanitized_user_input.. 什么都不做一样。 -
“我们有成千上万个这样的”这没有意义。为什么要以这种方式存储输入?出于存储目的而对字符串进行 repr() 处理是没有意义的。
-
你为什么不用泡菜或者更简单的东西?
-
如果要相信文档,pickle 会慢一个数量级以上并且不一定更安全
-
我也很好奇为什么数据首先会被重复。