Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬 평가()

<시간/>

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)