今回は、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でinputで入力した値をかけ算したり、掛け算する関数を作る方法
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() 関数について、その動作と脆弱性を理解しました。