설명
도메인이나 호스트 검증 정규식에서 점(.)을 이스케이프하지 않거나 경계 조건이 부족하면 의도하지 않은 호스트가 허용될 수 있습니다.
잠재적 영향
- SSRF, 오픈 리다이렉트, 외부 콜백 allowlist 우회로 이어질 수 있습니다.
- 공격자가 신뢰되지 않은 도메인을 정상 도메인처럼 통과시킬 수 있습니다.
해결 방법
- 도메인 구분 점은 정규식에서
\.로 이스케이프하세요. Go의 큰따옴표 문자열에서는\\.로 표기합니다. - 가능하면 URL을 파싱한 뒤 정확한 호스트 허용 목록과 비교하세요.
예시
변경 전
go
ok, _ := regexp.MatchString("^api.example.com$", host)
변경 후
go
ok, _ := regexp.MatchString("^api\\.example\\.com$", host)
설명:
- 변경 전: 호스트명이나 도메인을 검증하는 정규식에서 점(
.)을 이스케이프하지 않으면 의도한 도메인보다 훨씬 넓은 입력이 허용될 수 있습니다. - 변경 후: Go의 일반 문자열에서
\\.를 쓰면 정규식에는 리터럴 점을 뜻하는\.가 전달됩니다. 시작과 끝 앵커로 전체 호스트명을 비교합니다.