Python eval: 組み込み関数と属性アクセスを無効にしても危険ですか? 質問する

Python eval: 組み込み関数と属性アクセスを無効にしても危険ですか? 質問する

我々はすべてそれを知っているeval危険です危険な関数を隠しても、Pythonのイントロスペクション機能を使って中身を掘り下げて再抽出することができるので、 は削除しても、次のようにし__builtins__て取り出すことができます。

[c for c in ().__class__.__base__.__subclasses__()  
 if c.__name__ == 'catch_warnings'][0]()._module.__builtins__

しかし、私が見た例ではどれも属性アクセスを使用しています。すべての組み込み関数を無効にしたらどうなるでしょうか。そして属性アクセスを無効にします (Python トークナイザーを使用して入力をトークン化し、属性アクセス トークンがある場合は拒否します)。

質問される前に言っておきますが、私の使用例ではどちらも必要ないので、それほど問題にはなりません。

私がやろうとしているのは、SymPyの象徴する関数はより安全です。現在、入力をトークン化し、それに対していくつかの変換を行い、名前空間で評価します。しかし、属性アクセスを許可しているため安全ではありません (実際には必要がないにもかかわらず)。

ベストアンサー1

Python 3.6の新機能の1つについてお話しします。f弦

式を評価することができ、

>>> eval('f"{().__class__.__base__}"', {'__builtins__': None}, {})
"<class 'object'>"

ただし、属性アクセスは Python のトークナイザーでは検出されません。

0,0-0,0:            ENCODING       'utf-8'        
1,0-1,1:            ERRORTOKEN     "'"            
1,1-1,27:           STRING         'f"{().__class__.__base__}"'
2,0-2,0:            ENDMARKER      '' 

おすすめ記事