安全地使用python exec

时间:2014-07-05 14:01:41

标签: python

我想从文件中读取一组变量定义。我想使用execfile来阅读它们(以简化我的输入代码)。考虑:

#! /usr/bin/python

from math import *
import os

cmd="""
a=[0,3]
b=[0,1]
print 'Hello'
print sin(2)
os.system('rm my_important_file')
"""
gd={}
ld={}
exec(cmd,gd,ld)
print ld

(我在这里使用exec代替execfile来简化问题)。如您所见,我试图通过提供字典作为第二和第三个参数来安全地使用exec。我想只将变量定义作为输入文件中的有效操作。因此print 'Hello'print sin(2)os.system('rm my_important_file')都会产生错误。它似乎适用于最后两个,但不适用于print 'Hello'。这是什么原因?

1 个答案:

答案 0 :(得分:2)

print是一种语句,一种语言功能。执行它不需要导入。使用execexecfile时,您正在执行所有有效的Python代码,其中包含print语句。

您的空字典也不会阻止进口。我仍然可以这样做:

import os
os.system('rm my_important_file')

在配置文件中,并在此文件上调用execfile()的Python代码的权限下执行。

如果您的配置文件仅允许使用作业和表达式子集,请勿使用execfileexec 。没有办法让那些安全的&#39 ;; Python太过动态了。

将文件解析为域特定语言,或使用其他预先存在的配置文件格式,例如ConfigParser。但是,这些不允许执行Python表达式。