설명
예외 객체를 문자열로 변환한 결과나 args 값을 HTTP 응답에 그대로 포함하면 파일 경로, SQL 오류, 내부 호스트명, 설정 값 같은 구현 세부 정보가 외부에 노출될 수 있습니다. 공격자는 이 정보를 이용해 입력 검증 우회, 인젝션 조정, 환경 정찰을 더 쉽게 수행할 수 있습니다.
잠재적 영향
- 내부 경로, 데이터베이스 구조, 서비스 이름이 노출될 수 있습니다.
- 공격자가 취약한 입력값을 조정하기 쉬워집니다.
- 인증 또는 권한 검증 실패 사유가 과도하게 드러날 수 있습니다.
해결 방법
- 예외 상세 메시지는 접근을 제한한 서버 로그에 기록하고, 비밀번호나 토큰 등 비밀정보는 제외합니다.
- 클라이언트에는 일반화된 오류 메시지와 적절한 상태 코드만 반환합니다.
- Flask, FastAPI, Django의 공통 예외 처리 계층을 사용해 안전한 오류 응답 포맷을 일원화합니다.
- 운영 환경에서는 프레임워크의 디버그 오류 페이지를 비활성화합니다.
예시
변경 전
python
@app.route("/bad")
def server_bad():
try:
do_computation()
except Exception as e:
return str(e)
변경 후
python
@app.route("/safe")
def server_safe():
try:
do_computation()
except Exception:
current_app.logger.exception("request failed")
return "Internal error", 500
설명:
- 변경 전: 예외 상세 메시지를 응답 본문에 그대로 반환합니다.
- 변경 후: 상세 정보는 로그에만 남기고 사용자에게는 일반화된 메시지를 반환합니다.