Apigee 및 Apigee Hybrid 문서입니다.
Apigee Edge 문서 보기
RegularExpressionProtection 정책은 입력 매개변수 또는 흐름 변수에서 런타임에 평가되는 정규 표현식을 정의합니다. 일반적으로 이 정책을 사용하여 SQL 또는 자바스크립트 삽입과 같은 콘텐츠 위협을 방지하거나 이메일 주소 또는 URL과 같은 잘못된 형식의 요청 매개변수를 확인할 수 있습니다.
정규 표현식은 요청 경로, 쿼리 매개변수, 양식 매개변수, 헤더, XML 요소(XPath로 정의된 XML 페이로드), JSON 객체 속성(JSONPath를 통해 정의된 JSON 페이로드)에 정의할 수 있습니다.
다음과 같은 RegularExpressionProtection 정책 예시는 SQL 삽입 공격으로부터 백엔드를 보호합니다.
<!-- /antipatterns/examples/greedy-1.xml --> <RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="RegexProtection"> <DisplayName>RegexProtection</DisplayName> <Properties/> <Source>request</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <QueryParam name="query"> <Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)| (insert)|(shutdown)|(update)|(\bor\b))</Pattern> </QueryParam> </RegularExpressionProtection>
안티패턴
기본 수량자(*
, +
, ?
)는 기본적으로 탐욕적이므로 항상 가장 긴 시퀀스와의 매칭을 시작합니다. 일치하는 항목이 없으면 점진적으로 되돌아가서 패턴 매칭을 시도합니다. 패턴과 일치하는 결과 문자열이 매우 짧으면 탐욕적 수량자 사용 시간이 필요 이상으로 길어질 수 있습니다. 페이로드가 수십 또는 수백 KB로 큰 경우에 특히 그렇습니다.
다음 예시 표현식에서는 탐욕적 연산자인 .*
의 여러 인스턴스를 사용합니다.
<Pattern>.*Exception in thread.*</Pattern>
이 예시에서 RegularExpressionProtection 정책은 먼저 가장 긴 시퀀스인 전체 문자열 매칭을 시도합니다. 일치하는 항목이 없으면 정책이 점진적으로 되돌아갑니다. 일치하는 문자열이 페이로드의 시작 부분이나 중간 부분에 가까울 경우 .*
같은 탐욕적 수량자를 사용하면 .*?
같은 까다로운 한정자 또는 (일반적이지 않은) .*+
같은 독점적 수량자보다 훨씬 더 많은 시간과 처리 능력이 소요될 수 있습니다.
까다로운 수량자(예: X*?
, X+?
, X??
)는 페이로드 시작 부분에서 단일 문자를 매칭하기 시작하고 점진적으로 문자를 추가합니다.
독점적 수량자(예: X?+
, X*+
, X++
)는 전체 페이로드에 대해 한 번만 매칭을 시도합니다.
위의 패턴에 대한 다음 샘플 텍스트를 보겠습니다.
Hello this is a sample text with Exception in thread with lot of text after the Exception text.
이 경우 탐욕적 .*
를 사용하면 성능이 저하됩니다. .*Exception in thread.*
패턴은 141단계로 매칭을 수행합니다. 까다로운 수량자를 사용하는 .*?Exception in thread.*
패턴을 대신 사용할 경우 55단계만 거치면 됩니다.
영향
RegularExpressionProtection 정책에 와일드 카드(*
) 같은 탐욕적 수량자를 사용하면 다음과 같은 결과가 발생할 수 있습니다.
- 중간 페이로드 크기(최대 1MB)의 API 요청 전체 지연 시간 증가
- RegularExpressionProtection 정책 실행 완료 시간 증가
- Apigee 라우터에 사전 정의된 제한 시간이 경과하면 대용량 페이로드(1MB 초과)가 포함된 API 요청이 504 게이트웨이 시간 초과 오류와 함께 실패
- 대용량 처리로 인해 메시지 프로세서의 CPU 사용률이 높아져 다른 API 요청에 대한 영향 증가
권장사항
- RegularExpressionProtection 정책의 정규 표현식에
.*
같은 탐욕적 수량자를 사용하지 마세요..*?
같은 까다로운 수량자나.*+
같은 독점적 수량자(일반적이지 않음) 중 가능한 것을 대신 사용하세요.