-1

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

我正在尝试使用传递给的字符串访问局部变量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': []}

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

谢谢!

4

1 回答 1

4

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

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

pickle源代码猜测我会说你需要跳过 3 帧、当前调度方法、Unpickler.load调用当前调度方法的方法和模块级loads()函数,这样sys._getframe(3).f_locals['local_var']才能得到你想要的参考。

于 2012-12-28T20:52:08.217 回答