eval() 메소드는 이 메소드에 전달된 표현식을 구문 분석하고 프로그램 내에서 표현식을 실행합니다. 즉, 파이썬 프로그램 내에서 문자열을 코드로 해석합니다.
구문
eval의 구문은 다음과 같습니다. -
eval(expression, globals=None, locals=None)
어디에
-
표현 − 메소드에 전달된 파이썬 표현식입니다.
-
전 세계 − 사용 가능한 전역 메서드 및 변수의 사전.
-
현지인 − 사용 가능한 로컬 메서드 및 변수의 사전.
아래 예제에서는 사용자가 표현식을 생성하고 파이썬 프로그램을 실행하여 해당 표현식을 평가할 수 있습니다. 따라서 동적 코드를 만드는 데 도움이 됩니다.
예시
# expression to be evaluated user_expr = raw_input("Enter an expression in terms of variable a):") #nter the value of variable a = int(raw_input("Enter the value of a:")) # evaluate the expression result = eval(user_expr) # printing evaluated result print("Result = {}".format(result))
출력
위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -
Enter an expression in terms of variable a):a*(a-3)+a^2 Enter the value of a:7 Result = 33
eval()의 보안 문제
웹 응용 프로그램 또는 데스크톱 프로그램과 관련된 프로그램의 경우 이러한 eval() 메서드를 사용하면 보안 취약점이 발생할 가능성이 있습니다. 프로그램을 실행하면 파일을 삭제하거나 시스템에서 중요한 데이터를 가져오는 시스템 명령인 표현식이 제공될 수 있기 때문입니다. 이를 방지하기 위한 단계로 eval() 함수를 일부 선택된 함수 또는 변수로 제한할 수 있습니다.
이러한 취약점을 방지하기 위한 단계는 다음과 같습니다 -
eval() 메서드에서 지역 변수와 전역 변수를 모두 생략합니다.
이런 식으로 현재 범위 내에서만 평가되고 이 범위 밖의 다른 변수는 찾지 않습니다.
로컬 매개변수만 생략
지역 변수를 생략하면 모든 변수의 범위가 전역 변수로 지정됩니다. 다음으로 우리는 빈 사전을 전역 변수로 전달하고 프로그램에 다른 라이브러리를 가져온 경우에도 내장 변수만 사용할 수 있도록 합니다.
예시
from time import * print(eval('dir()', {}))<출력>
위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -
['__builtins__']
다음으로 가져온 라이브러리의 특정 메서드만 프로그램에서 사용할 수 있도록 허용할 수도 있습니다.
from time import * print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))
출력
위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -
['Localtime', '__builtins__', 'sleeptime']
글로벌 및 로컬 모두에 선택적 함수 전달
내장된 라이브러리는 허용하지 않고 로컬에서 가져온 라이브러리의 일부만 허용하여 로컬 및 전역 범위에서 기능의 가용성을 제한할 수도 있습니다. 아래 예에서는 시간 라이브러리에서 gmtime 메서드만 사용할 수 있도록 했습니다.
예시
from time import * a = 1445945763 print(eval('gmtime(a)', {'__builtins__': None}, {'a': a, 'gmtime': gmtime}))
출력
위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -
time.struct_time(tm_year=2015, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=36, tm_sec=3, tm_wday=1, tm_yday=300, tm_isdst=0)출력>