2016-10-22 5 views
0

Python 2.7では、globalを{'__builtins__': None}と定義することによって、evalによって使用される__builtins__名前空間を制限することができました。これはPython 3.5では動作しないようです。Python 3.5でevalで__builtins__を適切に制限する方法は?

のPython 2.7が正しくNameErrorを与える:

In [1]: eval('round', {'__builtins__': None}) 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-14-dc1cae9c6b26> in <module>() 
----> 1 eval('round', {'__builtins__': None}) 

<string> in <module>() 

NameError: name 'round' is not defined 

のPython 3.5は、次を与える:

In [1]: eval('round', {'__builtins__': None}) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-9-83a8846287f1> in <module>() 
----> 1 eval('round', {'__builtins__': None}) 

<string> in <module>() 

TypeError: 'NoneType' object is not subscriptable 

の両方が次の正しい出力を与える:私はどのように

In [1]: eval('round') 
Out[1]: <function round> 

を適切に制限する__builtins__またはこれを回避しますか?

答えて

2

あなたは空の辞書に設定することができます

eval('round', {'__builtins__': {}}) 

これは、あなたは、Python 2.xの中で得たNameErrorを再現しますただし、2または3のいずれの場合でも、サンドボックス化Pythonはinherently hard problemです。可能であれば、eval()の代わりにast.literal_eval()のような強力でないものを使用する必要があります。

+0

ありがとう、ありがとう。数学演算を評価する別の方法がありますか? '1 + 1'? AFIK、 'ast.literal_eval'はこれを許可しません。 – mrclary

+0

'ast 'の他のコンポーネントは、あなたが望む言語のサブセットのパーサを構築するのに十分強力ですが、かなりの量の作業であり、属性アクセスを許可することについて非常に注意する必要があります'foo.bar'の点線の構文)。 – Kevin

関連する問題