Python eval() 関数
eval()文字列内の Python 式を実行するための Python の組み込み関数です。
eval()文字列を受け取り、それを Python コードとして実行し、実行結果を返します。これは強力な機能ですが、不適切に使用するとセキュリティリスクをもたらします。
単語の解説: evalであるevaluate(評価)の略です。
基本構文とパラメータ
構文形式
eval(expression, globals, locals)
パラメータの説明
- パラメータ expression:
- 型: 文字列
- 説明: 実行する Python 式。
- パラメータ globals(オプション):
- 型: 辞書
- 説明: グローバル名前空間。
- パラメータ locals(オプション):
- 型: 辞書
- 説明: ローカル名前空間。
関数の説明
- 戻り値: 式の実行結果を返します。
- セキュリティ警告: 信頼できない入力に使用しないでください。
eval()、コードインジェクション攻撃を引き起こす可能性があります。
例
例1:基本的な使い方
例
# 数式を計算
result = eval("1 + 2 + 3")
print(result) # 出力: 6
# 変数を使用
x = 10
result = eval("x * 2")
print(result) # 出力: 20
# 複雑な式
result = eval("2 ** 3 + 4 * 5")
print(result) # 出力: 28
# 関数呼び出し
result = eval("len('hello')")
print(result) # 出力: 5
result = eval("1 + 2 + 3")
print(result) # 出力: 6
# 変数を使用
x = 10
result = eval("x * 2")
print(result) # 出力: 20
# 複雑な式
result = eval("2 ** 3 + 4 * 5")
print(result) # 出力: 28
# 関数呼び出し
result = eval("len('hello')")
print(result) # 出力: 5
期待される実行結果:
6 20 28 5
コードの解説:
eval()算術式を実行できます。- 定義済みの変数を参照できます。
- 組み込み関数を呼び出せます。
例2:制限された環境
例
# 使用可能な関数と変数を制限
x = 10
y = 20
# 制限付きのグローバル辞書を作成
safe_dict = {"x": x, "y": y, "abs": abs}
result = eval("x + y", safe_dict)
print(result) # 出力: 30
# 危険な関数へのアクセスは許可されていません
try:
eval("__import__('os').system('ls')", {})
except NameError as e:
print(f"セキュリティ制限: {e}")
x = 10
y = 20
# 制限付きのグローバル辞書を作成
safe_dict = {"x": x, "y": y, "abs": abs}
result = eval("x + y", safe_dict)
print(result) # 出力: 30
# 危険な関数へのアクセスは許可されていません
try:
eval("__import__('os').system('ls')", {})
except NameError as e:
print(f"セキュリティ制限: {e}")
期待される実行結果:
30 安全限制: name '__import__' is not defined
この例は、globals 辞書を制限することで、eval()の安全性を高める方法を示しています。
その他の拡張