1

我正在创建一个 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 数据类型(元组等),但我不想在整个项目代码中处理 eval。

4

2 回答 2

1

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

看:

  1. Python eval() 在不受信任的字符串上的安全性?
  2. 在 Python 中使用 eval?

如果要使用 python 数据类型,最好将其存储为 python 模块并导入。在这种情况下,这可能是一个更好的解决方案。

您可以将配置文件拆分为在 python 模块中包含 python 数据类型的配置文件,并将其余部分保留为可由 configparser 解析的配置文件。

于 2010-11-14T13:54:10.853 回答
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

像这样的用例正是这个函数的用途。

于 2010-11-14T13:58:45.510 回答