pickle命令字符串中的局部变量?

时间:2012-12-28 20:49:00

标签: python pickle

这是为了安全比赛,请不要对我大喊:)

我正在尝试使用传递给pickle.loads()的字符串来访问局部变量。例如,我想做这样的事情:

local_var = 1
pickle.loads('''c__builtin__
eval
(c__builtin__
compile
(S"print local_var"
S"error_output_file"
S"exec"
tRtR.''')

但是,我收到以下错误:NameError: name 'local_var' is not defined

实际上,当我检查局部变量时,它们与我期望的完全不同:

pickle.loads("""c__builtin__
locals
(tR.""")

给出

{'args': (),
 'func': <function locals>,
 'self': <pickle.Unpickler instance at 0x108af3830>,
 'stack': []}

这里发生了什么,我该怎么做我想要的?

谢谢!

1 个答案:

答案 0 :(得分:3)

pickle.loads()函数无法直接访问您从调用的.loads() 代码的本地代码。它有自己的范围。在这种情况下,您正在查看正在处理pickle.Unpicler调用的.loads()实例上的某个方法的本地命名空间。

您必须使用sys._getframe()来访问调用堆栈,然后查看各个帧的.f_locals映射以达到调用函数的本地。

pickle source猜测我要说你需要跳过3帧,当前的调度方法,调用当前调度方法的Unpickler.load方法和模块级loads()函数,所以sys._getframe(3).f_locals['local_var']可以为你提供你想要的参考。