2010-11-14 62 views
1

我創建ConfigParser的子類,是容易,我在我的項目中使用:覆蓋ConfigParser get()方法以包含eval的任何缺點?

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)) 

問:是否有任何缺點(安全性,意想不到的後果)與一個重寫的get()方法包括評估?

我寧願將eval燒入MyConfiguration類,因爲我想在我的配置文件中使用Python數據類型(元組等),但我不想處理遍佈我的項目代碼的evals。

+1

你的意思是,除了eval的所有常見缺點? – delnan 2010-11-14 14:25:07

回答

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 

像這樣的用例正是這個函數的目的。

1

我不確定評估可能包含在配置文件中的任意文本是否是個好主意。正常的eval調用通常被認爲是不安全的。

參見:

  1. Security of Python's eval() on untrusted strings?
  2. Use of eval in Python?

如果你想使用Python的數據類型,那麼它是更好的將其存儲爲一個Python模塊和導入。在這種情況下,這可能是更好的解決方案。

你可以將配置文件拆分爲包含Python模塊中的python數據類型的配置文件,並將其餘配置文件保存爲可由configparser解析的配置文件。

+0

那麼ConfigParser的典型用法是創建和使用具有基本數據類型(即那些有特定get()方法的配置文件,如str,int,float,boolean)?或者容器是允許的,但是eval通常在調用類中完成(可能有更好的方法來處理eval)? – MikeRand 2010-11-14 16:33:50

+0

@MikeRand:是的,最好在調用類中調用eval。儘管我的回答指出了eval的問題,但aaronasterling提供了更好的答案。你可以使用它。 – pyfunc 2010-11-14 17:17:01