Pythonのevalは組み込み関数で、この関数の役割は、渡された式文字列の結果を返すことです。書式文字列、評価、評価戻り値の引数として文字列で記述された等号の右側の式は、この式の結果であり、変数の割り当てを想像します。
Pythonのeval関数での使用は、安全性が最大の欠点である、非常に柔軟なだけでなく、非常に危険です。柔軟性と導入のevalのリスクの両方からこの記事。
1、パワーの
いくつかの例では、文字列のリストを変換し、タプル、辞書年代を感じます。
強力なバーは、evalのに文字列に、evalの表現はあなたの戻り値を与えます。
次のようにevalの構文は次のとおりです。
表現:文字列
グローバル:変数のスコープ、グローバル名前空間、提供されている場合、辞書オブジェクトでなければなりません。
地元の人々:変数のスコープは、ローカル名前空間は、提供されている場合、任意のマップのオブジェクトでもよいです。
グローバルや地元の人々との組み合わせにより、いくつかの例を見て
グローバル送信パラメータ値{「年齢」:1822}、
出力
地元の変数と相まって
上記の2つの例は、パラメータがブランク地元である場合、グローバルパラメータは可変パラメータグローバルがあるかどうかを見つけるために、空ではなく、計算されることがわかります。
2つのパラメータは空ではありませんが、地元の人々に最初のパラメータを見て、その後、パラメータのグローバルを見つけた場合、同じ名前の地元のパラメータは変数にグローバル変数を上書きします。
2.危険
evalのは便利ですが、セキュリティは、ファイルや他の操作を削除するには、システムコマンドを実行するために使用することができ、文字列式と実行に変換することができますことに注意してください。
悪意のあるユーザーの入力と仮定します。例えば:
evalの( "__輸入__( 'OS')。システム( 'LS /home/pythontab.com/www/')")
だから、evalの()の後に、あなたは、現在のフォルダのファイルが展示ユーザーの目の前に今あることがわかります。実際には、この文はの実装に相当します
os.system( 'LS /home/pythontab.com/www/')
そして、入力を続行:
evalの( "__輸入__( 'OS')。システム( '猫/home/pythontab.com/www/test.sql')")
コードのポスター。
ここでも削除コマンド、ファイルが消えました。そのようなものとして
evalの( "__輸入__( 'OS')。システム( 'RM /home/pythontab.com/www/test.data')")
だから我々は、安全に注意を払う必要があり、彼の柔軟性を楽しむために、一方では、evalを使用します。