我正在创建一个ConfigParser的子类,我可以更轻松地在整个项目中使用它:
class MyConfiguration(ConfigParser.ConfigParser):
def __init__(self, filename):
ConfigParser.ConfigParser.__init__(self)
self.readfp(open(filename))
def get(self, section, option):
return eval(ConfigParser.ConfigParser.get(self, section, option))
问题:使用包含eval的方法覆盖get()方法是否存在任何缺点(安全性,意外后果)?
我宁愿将eval烘焙到MyConfiguration类中,因为我想在配置文件中使用Python数据类型(元组等),但我不想在整个项目代码中处理evals。
答案 0 :(得分:1)
我不确定评估配置文件中可能包含的任意文本是否是个好主意。对eval的正常调用通常被认为是不安全的。
请参阅:
如果你想使用python数据类型,那么将它存储为python模块并导入它会好得多。在这种情况下,这可能是更好的解决方案。
您可以将配置文件拆分为python模块中包含python数据类型的配置文件,并将其余部分保存为可由configparser解析的配置文件。
答案 1 :(得分:1)
如果你对eval
的唯一兴趣是你似乎指出的字面值,那么你可以使用ast.literal_eval
这将读取元组文字,列表文字和其他文章,并且可以安全使用,因为它可以选择接受它。
>>> import ast
>>> a = ast.literal_eval('(1, 2, 3)')
>>> a
(1, 2, 3)
>>> b = ast.literal_eval('__import__("evil")')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/ast.py", line 68, in literal_eval
return _convert(node_or_string)
File "/usr/lib/python2.6/ast.py", line 67, in _convert
raise ValueError('malformed string')
ValueError: malformed string
此类用例正是此功能的用途。