설명
TypeScript 또는 JavaScript 코드에서 외부 입력으로 정규표현식 패턴을 정하게 하면, 공격자가 실행 시간이 매우 긴 패턴을 전달해 서비스 거부 상태를 만들 수 있습니다.
잠재적 영향
- 이벤트 루프가 오래 점유되어 정상 요청 처리가 지연될 수 있습니다.
- CPU 사용량 증가로 애플리케이션 인스턴스가 불안정해질 수 있습니다.
해결 방법
- 정규표현식은 가능하면 검토한 리터럴 또는 상수로 정의하세요.
- 동적 패턴이 필요하면 허용 목록 기반으로 선택하고, 사용자 입력을 패턴 문법으로 직접 해석하지 마세요.
- 실행 시간이 커질 수 있는 중첩 반복과 모호한 대체 패턴을 피하세요.
예시
변경 전
typescript
function search(value: string, pattern: string) {
return new RegExp(pattern).test(value);
}
변경 후
typescript
const allowedPatterns = new Map([
["username", /^[a-z0-9_]{3,32}$/i],
["ticket", /^TICKET-\d{4,10}$/],
]);
function search(value: string, patternName: string) {
const pattern = allowedPatterns.get(patternName);
if (!pattern) {
throw new Error("Unsupported pattern");
}
return pattern.test(value);
}
설명:
- 변경 전: 호출자가 전달한 문자열을 정규표현식 패턴으로 직접 해석합니다.
- 변경 후: 이름으로 검토된 고정 패턴을 선택하고, 등록되지 않은 이름은 거부합니다.