도대체 뭘 하는 함수길래 사용을 조심하라는 포스팅이 먼저 노출이 될까...
(warning : 이 포스팅은 python eval() 함수 - 사용을 조심해야 하는 이유 를 보고 고대로 따라 하였습니다. 왜 따라했냐고 물으신다면 공부 기록을 남기고 싶었습니다... 한번만 선처해주세요...)
eval(expressions, [,globals][,locals])
의 공식문서 를 살펴 보면 , 해당 함수에 들어가는 매개값(expressions,[,globals][,locals])
과 어떻게 동작하는지를 살펴 볼 수 있는데 그 중 expressions 에 대해서만 알아보도록 한다.
간단하게 설명하자면 String type의 expressions의 실행 결과를 반환하는 함수인데, 예제 코드를 보며 이해해보자.
# 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()
은 사용자에게 수식을 입력받으면 그 수식에 대한 결과값을 리턴해주는것 같다. 근데 꼭 수식의 실행결과만 반환하는 것일까?
다음 코드를 보며 한번 확인해보자.
# 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
이라는 명령어를 사용하였기에 망정이지 모든 파일을 지우라는 명령을 입력했다면..