Python

[eval] 문자열 식 실행

비번변경 2021. 12. 17. 17:03

eval

문자열형의 식을 입력받아 그 실행 결과를 반환하는 함수

 

 

예시

print(f"1 + 2 = {eval('1 + 2')}")
print(f"1 == 2 = {eval('1 == 2')}")

eval 예시

 

함수의 실행 결과도 반환할 수 있다.

print(eval("print('hello')"))

eval 실행 결과 반환

 

주의점

간편하고 강력하지만 사용자의 입력값을 eval 함수로 실행시키는 등의 코드는 사용하지 않도록 한다. 해킹의 위험성이 존재하기 때문이다. 간단한 예를 통해 알아보자.

 

예시 코드

아래 코드는 사용자가 입력한 수식을 계산하여 출력하는 코드이다.

def input_eval():
    user_input = input("enter expression: ")
    return eval(user_input)


print(input_eval())

주의점 예시 코드

 

그런데, 사용자가 개발자 의도와는 다르게 __import__('os').system('dir c:\\')와 같은 입력을 했다고 하자.

디렉터리 구조 노출 가능

시스템의 디렉터리 구조가 노출되는 것을 확인할 수 있다. 

 

이처럼 eval 함수는 입력받은 식을 그대로 실행하기 때문에 Command Injection에 취약할 수 있다. 또한, 코드 가독성을 떨어트리거나 디버깅을 어렵게 할 수 있기 때문에 사용을 지양하는 것이 좋다.

 

💡 Command Injection
명령어를 삽입한다는 뜻
웹 요청 메세지에 임의의 시스템 명령어를 삽입하고 전송하여 웹 서버에서 해당 명령어를 실행하도록 하는 공격
remote code execution이라고 부르기도 한다.

참고문서

https://bluese05.tistory.com/64

https://www.stackhawk.com/blog/command-injection-python/

 

Command Injection in Python: Examples and Prevention

An overview of command injection in python with examples and best security practices including tips on how to find & fix this vulnerability.

www.stackhawk.com

 

728x90