Pythonのeval関数の使い方や問断点について解説する

スポンサーリンク

今回は、Pythonのeval()関数に注目します。

スポンサーリンク

Pythonのeval()関数を理解しよう

Python の eval() 関数は、渡された式を変換して計算します。

注意: このメソッドはテスト目的でのみ使用してください。

eval()関数は、渡された式をサニタイズしません。

悪意のあるユーザーがここでPythonのコードを実行すると、サーバーへの抜け道になりえます。

eval()関数はPythonの式を解析し、パラメータとして渡されたコードをPythonプログラム内で実行します。

構文は以下の通りです。

eval('expression', globals=None, locals=None)
  • expression: 式`: Pythonの式(文字列パラメータ)で、ユーザーがPythonのコード内で計算したいものを指定します。
  • globals: eval()関数が実行可能な式を指定する辞書です。
  • locals: eval()関数が利用できるローカルメソッドとデータ変数を記述します。

例 1: 二つのローカル変数を追加する式を渡す場合

a=20
b=30
res = eval('a+b')
print(res)

上記のコードでは、eval() 関数に ‘a+b’ という式を渡して、a, b という 2 つのローカル変数を追加しています。

出力は以下の通りです。

 

例として以下の様になります。

num1 = int(input())
num2 = int(input())
mult = eval('num1*num2')
print('Multiplication:',mult)

上記の例では、ユーザーからの入力を受け付け、変数に代入しています。

さらに、これら2つの入力値の掛け算を表す式を渡しました。

出力は

30
20
Multiplication: 600

Python の eval() 関数と Pandas モジュール

Pythonのeval関数は、Pandasモジュールでも操作できます。

pandas.eval()関数は式を受け取り、Pythonのプログラム内で同じように実行します。

構文は以下の通りです。

DataFrame.eval('expression',inplace)
  • 式`: Python プログラム内で実行される、引用符で囲まれた Python 式です。
  • inplace: デフォルト値=TRUE。python式が代入式であることが判明した場合、inplaceは処理を実行することを決定し、データフレームオブジェクトを変異させます。FALSE の場合、新しいデータフレームが作成され、結果として返されます。

例 1: inplace = TRUE での式の渡し方

import pandas
data = pandas.DataFrame({"x":[1,2,3,4],"y":[1,3,5,7],"w":[2,4,6,8],"z":[1,1,1,1]})
print("Original data:
"
)
print(data)
data.eval('z = x * y', inplace = True)
print("Data after executing eval():
"
)
print(data)

上記の例では、データフレームを作成し、Pythonスクリプト内で実行される式を渡しています。

inplaceがTRUEに設定されているので、式から得られたデータ値は同じdataframeオブジェクトの’data’に格納されます。

結果は以下の通りです。

Original data:
 
   x  y  w  z
0  1  1  2  1
1  2  3  4  1
2  3  5  6  1
3  4  7  8  1
 
Data after executing eval():
 
   x  y  w   z
0  1  1  2   1
1  2  3  4   6
2  3  5  6  15
3  4  7  8  28

例として以下の様になります。

import pandas
data = pandas.DataFrame({"x":[1,2,3,4],"y":[1,3,5,7],"w":[2,4,6,8],"z":[1,1,1,1]})
print("Original data:
"
)
print(data)
data1 = data.eval('z = x * y', inplace = False)
print("Data after executing eval():
"
)
print(data1)

上記のコードでは、eval()関数にinplace = FALSEを渡しています。

このため、python 式の結果は新しい dataframe オブジェクト ‘data1’ に格納されます。

出力されます。

Original data:
 
   x  y  w  z
0  1  1  2  1
1  2  3  4  1
2  3  5  6  1
3  4  7  8  1
Data after executing eval():
 
   x  y  w   z
0  1  1  2   1
1  2  3  4   6
2  3  5  6  15
3  4  7  8  28

eval() 関数に関するセキュリティ上の問題

  • Pythonのeval()関数は、セキュリティ上の脅威にさらされやすい。
  • Pythonのeval()関数はセキュリティの脅威にさらされやすくなっています。
  • そのため、globalsとlocalsというパラメータを用意し、データへの直接アクセスを制限しています。

概要

  • Python の eval() 関数は、Python スクリプト内で Python 式を直接実行するために使用されます。
  • eval()関数はPandasモジュールでも同様に使用することができます。
  • Pythonのeval()関数は、セキュリティ上の脅威を受けやすいので注意が必要です。Pythonのeval()関数は、セキュリティ上の脅威を受けやすいため、eval()関数に渡される情報を事前にチェックする必要があります。

まとめ

以上、Python の eval() 関数について、その動作と脆弱性を理解しました。


タイトルとURLをコピーしました