Python eval() 함수를 아시나요?

mickey·2021년 2월 4일
2

python

목록 보기
1/1

eval()?


도대체 뭘 하는 함수길래 사용을 조심하라는 포스팅이 먼저 노출이 될까...
(warning : 이 포스팅은 python eval() 함수 - 사용을 조심해야 하는 이유 를 보고 고대로 따라 하였습니다. 왜 따라했냐고 물으신다면 공부 기록을 남기고 싶었습니다... 한번만 선처해주세요...)

설명

eval(expressions, [,globals][,locals])공식문서 를 살펴 보면 , 해당 함수에 들어가는 매개값(expressions,[,globals][,locals])과 어떻게 동작하는지를 살펴 볼 수 있는데 그 중 expressions 에 대해서만 알아보도록 한다.

간단하게 설명하자면 String type의 expressions의 실행 결과를 반환하는 함수인데, 예제 코드를 보며 이해해보자.

예제 실행

예제 코드 01

# eval 함수에게 뭔지 모를 expressions 를 처리 해 달라고 부탁합니다.
def get_eval_results(expressions):
    return eval(expressions)
    
# String type 으로 expressions 를 입력 받습니다.
x = str(input('expressions 입력 : '))

#get_eval_results 의 return 값을 출력합니다.
print(get_eval_results(x))

실행결과

expressions 입력 : 3 + 5
8

위 결과에서 보이듯, eval()은 사용자에게 수식을 입력받으면 그 수식에 대한 결과값을 리턴해주는것 같다. 근데 꼭 수식의 실행결과만 반환하는 것일까?

다음 코드를 보며 한번 확인해보자.

예제 코드 02

# eval 함수에게 이젠 뭔가 알 것 같은 expressions 를 처리 해 달라고 부탁합니다.
def get_eval_results(expressions):
    return eval(expressions)

# hello 를 출력하는 함수입니다.
def print_hello():
    return print('hello')
    
# String type 으로 expressions 를 입력 받습니다.
x = str(input('expression 입력 : '))

#get_eval_results 의 return 값을 출력합니다.
print(get_eval_results(x))

실행결과

expressions 입력 : print_hello()
hello
None

함수의 이름(print_hello())을 그대로 입력하였더니 함수가 실행이 되어버렸다.. 엄청 좋은 기능을 가지고 있다고 생각이 들면서 한편으론 불안함이 느껴진다. (오 모 나 print() 함수는 None 를 반환하는군요.)

그렇다면, 예제 코드 01 무서운 입력 을 넣어 그 불안함을 직면해보자.

실행결과

expressions 입력 : __import__('os').system('cat *')
# eval 함수에게 뭔지 모를 expressions 를 처리 해 달라고 부탁합니다.
def get_eval_results(expressions):
return eval(expressions)
# String type 으로 expressions 를 입력 받습니다.
x = str(input('expressions 입력 : '))
#get_eval_results 의 return 값을 출력합니다.
print(get_eval_results(x))

세상에 예제 코드 01 번이 뭐라고 작성되어 있는지 만천하에 공개되어 버렸다. 지금은 예를 들어 cat 이라는 명령어를 사용하였기에 망정이지 모든 파일을 지우라는 명령을 입력했다면..

eval() 없이 못사는 몸이 되어버린 사람은 어떡하나요?

profile
Hello

0개의 댓글