안티패턴: RegularExpressionProtection 정책에 탐욕적 한정자 사용

ApigeeApigee 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 정책의 정규 표현식에 .* 같은 탐욕적 수량자를 사용하지 마세요. .*? 같은 까다로운 수량자나 .*+ 같은 독점적 수량자(일반적이지 않음) 중 가능한 것을 대신 사용하세요.

추가 자료