데브허브 | DEVHUB | "literal_eval()" is Awesome in Python"literal_eval()" is Awesome in Python
eval() 함수는 문자열 형태의 코드를 실행하여 결과를 반환하며, 간단한 계산기 앱 구현 등에 활용될 수 있습니다. 💻
- 하지만
eval()은 사용자 입력과 함께 사용될 경우 악성 코드 주입의 취약점이 되어, 민감한 정보 탈취나 코드 변조와 같은 심각한 보안 문제를 야기할 수 있습니다. 🚨
- 예를 들어,
eval("locals()")와 같은 명령을 통해 스크립트 내의 secret key와 같은 민감한 로컬 변수에 접근할 수 있음을 보여줍니다. 🔑
- 이러한 보안 위험을 해결하기 위해
ast 모듈의 literal_eval() 함수를 사용할 수 있으며, 이는 오직 리터럴 구조만 평가하여 코드 실행을 방지합니다. ✅
literal_eval()은 globals()나 print()와 같은 코드가 아닌 리터럴이 아닌 입력을 받으면 예외를 발생시켜 안전성을 확보합니다. 🚫
literal_eval()이 허용하는 리터럴 구조는 문자열, 바이트, 숫자, 튜플, 리스트, 딕셔너리, 세트, 불리언, None으로 제한됩니다. 📚
literal_eval()도 100% 안전한 것은 아니며, 매우 깊게 중첩된 리터럴 구조(예: 1000개 계층의 리스트)는 C 스택 오버플로우나 구문 분석 오류를 일으킬 수 있습니다. ⚠️
- 따라서
literal_eval()을 사용하더라도, 사용자 입력에 대한 추가적인 유효성 검사를 통해 서비스 거부 공격이나 프로그램 충돌을 방지하는 것이 중요합니다. 🛡️
- 사용자 입력이 코드를 실행하지 않아야 할 경우
ast.literal_eval() 사용을 고려하되, 항상 자체적인 추가 검증을 병행해야 합니다. 💡