我々はすべてそれを知っている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 ''