Python의 ast
모듈: 안전한 문자열 표현식 평가하기
Python 개발 중, 문자열로 된 표현식을 실제 값으로 변환하려는 상황이 종종 발생합니다. 대표적으로 eval()
함수를 사용하는 경우가 있습니다. 그러나 eval()
은 신중하게 사용하지 않으면 보안 취약점을 초래할 수 있습니다. 이런 문제를 피하기 위해 Python은 ast
모듈의 literal_eval()
함수를 제공합니다.
eval()
의 위험성:
eval()
함수는 문자열로 된 Python 표현식을 실행합니다. 이는 악의적인 입력이 주어질 경우 시스템에 위험을 초래할 수 있습니다.
# 예시: 사용자 입력을 바로 eval()로 실행
user_input = input("표현식을 입력하세요: ")
result = eval(user_input)
이런 방식으로 사용자 입력을 바로 eval()
에 전달하면, 악의적인 사용자가 임의의 코드를 실행할 수 있습니다.
ast.literal_eval()
의 안전성:
ast.literal_eval()
는 eval()
보다 제한적입니다. 오직 Python의 기본 타입들만 평가하며, 표현식 내의 함수 호출이나 연산 등의 복잡한 작업은 허용하지 않습니다.
import ast
user_input = input("리스트나 숫자, 문자열 등의 표현식을 입력하세요: ")
result = ast.literal_eval(user_input)
이 함수를 사용하면, 예를 들어, 리스트나 딕셔너리 등의 문자열 표현을 안전하게 파싱할 수 있습니다.
결론:
보안이 중요한 상황에서는 문자열로 된 표현식을 평가할 때 eval()
대신 ast.literal_eval()
을 사용하는 것이 좋습니다. 이를 통해 예기치 않은 코드 실행과 같은 위험을 피할 수 있습니다.