5

クラスの例を次に示します。

from datetime import datetime
class Article:
    published = datetime.now()
    for propname in "year month day hour minute second".split():
        exec "%s = property(lambda self: self.published.%s)"%(propname, propname)
    del propname

ご覧のとおり、複数のオブジェクトexecの作成を最適化するために を使用しています。property()usingexecは良くないことであり、それはプログラムのセキュリティ ホールであるとよく読みます。この場合ですよね?

4

2 に答える 2

6

この場合、実際にはセキュリティ上の脅威ではありません。セキュリティ上の脅威は、実行された文字列がユーザーが何らかの種類のアクセス権を持っている場合に発生するためです。この場合、これは分割文字列リテラルです。

ただし、それがセキュリティ リスクでexecはない場合でも、ほとんどの場合、不適切な選択です。代わりにgetattrandを使用しないのはなぜですか?setattr

from datetime import datetime
class Article:
    published = datetime.now()

    def __init__(self):
        for propname in "year month day hour minute second".split():
            setattr(self, propname, getattr(self.published, propname))

1 つの欠点は、これを__init__メソッド内で行う必要があることです。そのため、そこに含めない正当な理由があるかどうかによって異なります。

于 2012-05-12T04:58:05.637 に答える
0

信頼できるデータでexecを使用しても問題ありません。ただし、この場合は不要であり、スクリプトの速度が低下します。

于 2012-05-12T05:55:18.187 に答える