1

PyPy docsによると、「ビルトイン名は常にビルトインモジュールを参照しており、CPython のように辞書を参照することはありません。ビルトインへの割り当ては効果がありません。」たとえば、CPython では次のようになります。

>>> eval("__import__('os').system('clear')", {'__builtins__':{}})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name '__import__' is not defined

PyPy では、エラーなしで実行されます。利用可能なビルトインを制限する別の方法はありますか?

4

1 に答える 1

2

いいえ、これは提供しないことがずっと前に決定されました。今なら考え直せるかもしれませんが、それは誤った安心感しか与えないことに注意してください。サードパーティが提供する文字列で eval() を呼び出すことは、{'__builtins__':{}}. Python: make eval safeを参照してください。

于 2013-04-15T16:41:24.323 に答える