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

質問: get() メソッドを eval を含むメソッドでオーバーライドすることの欠点 (セキュリティ、意図しない結果) はありますか?

構成ファイルで Python データ型 (タプルなど) を使用したいが、プロジェクト コード全体で評価を処理したくないため、評価を MyConfiguration クラスに焼き付けたいと考えています。

4

2 に答える 2

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 に答える
1

構成ファイルに含まれている可能性のある任意のテキストを評価するのが良い考えかどうかはわかりません。eval の通常の呼び出しは、通常、安全ではないと見なされます。

見る:

  1. 信頼できない文字列に対する Python の eval() のセキュリティ?
  2. Pythonでevalを使用しますか?

Python データ型を使用する場合は、Python モジュールとして保存してインポートする方がはるかに優れています。この場合、これはより良い解決策かもしれません。

構成ファイルを python モジュール内の python データ型を含むものとして分割し、残りを configparser で解析できる構成ファイルとして保持できます。

于 2010-11-14T13:54:10.853 に答える