覆盖ConfigParser get()方法包含eval的任何缺点?

时间:2010-11-14 13:47:21

标签: python configparser

我正在创建一个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。

2 个答案:

答案 0 :(得分:1)

我不确定评估配置文件中可能包含的任意文本是否是个好主意。对eval的正常调用通常被认为是不安全的。

请参阅:

  1. Security of Python's eval() on untrusted strings?
  2. Use of eval in Python?
  3. 如果你想使用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

此类用例正是此功能的用途。