토막코딩/Python

Python의 `ast` 모듈: 안전한 문자열 표현식 평가하기

컴곰 2023. 9. 26. 21:51

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()을 사용하는 것이 좋습니다. 이를 통해 예기치 않은 코드 실행과 같은 위험을 피할 수 있습니다.