RegularExpressionProtection 정책

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

내용

메시지(예: URI 경로, 쿼리 매개변수, 헤더, 양식 매개변수, 변수, XML 페이로드 또는 JSON 페이로드)에서 정보를 추출하고 사전 정의된 정규 표현식에 따라 해당 콘텐츠를 평가합니다. 지정된 정규 표현식이 true로 평가되면 메시지가 위협으로 간주되어 거부됩니다.

동영상

정규 표현식 보호 정책에 대해 자세히 알아보려면 다음 동영상을 시청하세요.

동영상 설명
SQL 삽입 공격으로부터 보호 (New Edge) New Edge 환경 UI의 정규 표현식 보호 정책을 사용하여 SQL 삽입 공격으로부터 보호하세요.
SQL 삽입 공격으로부터 보호 (Classic Edge) 기본 Edge UI에서 정규 표현식 보호 정책을 사용하여 SQL 삽입 공격으로부터 보호하세요.

샘플

GitHub

GitHub의 정규식 방지 샘플은 쿼리 매개변수를 통해 실행된 잠재적 SQL 삽입 공격을 감지하는 방법을 보여줍니다. 또한 이 샘플은 해커가 응답에서 유용한 정보를 얻는 것을 방지하기 위해 일반 400 오류 상태를 설정하는 좋은 방법을 보여줍니다.

자바스크립트에 공격 방지 포함

<RegularExpressionProtection name="JsonPathRegExProtection">
    <DisplayName>Regular Expression Protection 1</DisplayName>
    <Source>request</Source>
    <JSONPayload escapeSlashCharacter="true">
       <JSONPath>
          <Expression>$.</Expression>
          <Pattern>&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&gt;
          </Pattern>
          <Pattern>n\s*\\\\\s*slash</Pattern>
          <Pattern>n\s*\/\s*slash</Pattern>
          <Pattern>n\s*\\"\s*quotes</Pattern>
          <Pattern>n\s*\\b\s*space</Pattern>
          <Pattern>n\s*\\f\s*forwardfeed</Pattern>
          <Pattern>n\s*\\n\s*newline</Pattern>
          <Pattern>n\s*\\r\s*carria</Pattern>
          <Pattern>n\s*\\t\s*tab</Pattern>
          <Pattern>n\s*\\uFFFF\s*hex</Pattern>
       </JSONPath>
    </JSONPayload>
 </RegularExpressionProtection>

위 샘플은 정규식 방지 정책을 사용하여 자바스크립트 포함 공격의 JSON 페이로드를 평가하는 방법을 보여줍니다. 특히 <JSONPath>/<Expression>에서 추출된 콘텐츠는 <JSONPath>/<Pattern>의 정규 표현식과 비교하여 평가됩니다.

<JSONPath>/<Pattern>의 정규 표현식에 XML 예약 문자(", &, ', < 또는 .)가 포함되어 있는 경우 먼저 이를 XML로 인코딩한 후 정책 XML 구성 파일에 포함해야 합니다. 예를 들어 위 샘플에서 정규 표현식 <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*>&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&gt; 같이 XML로 인코딩되었습니다.

또한 정규 표현식에 슬래시(/)가 포함되어 있으면 <JSONPayload> escapeSlashCharacter 속성을 true로 설정하여 이스케이프 처리해야 합니다.

대소문자를 구분하지 않는 일치

대소문자를 구분하지 않는 일치는 일반적인 사용 사례입니다. (?i) 구문을 사용하여 정규 표현식에서 이를 구현하는 방법은 다음과 같습니다. 이 예시에서 DELETE, delete, Delete 등은 true로 평가됩니다.

<Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))</Pattern>

정규 표현식 보호 정책 정보

Apigee Edge를 사용하면 런타임 시 API 트래픽에 대해 평가할 수 있는 정규 표현식을 구성하여 특정 패턴을 따르는 일반적인 콘텐츠 수준 위협을 식별할 수 있습니다.

정규 표현식(약칭 정규식)은 문자열의 패턴을 지정하는 문자열 집합입니다. 정규식을 사용하면 콘텐츠의 패턴을 프로그래매틱 방식으로 평가할 수 있습니다. 예를 들어 이메일 주소가 올바르게 구조화되어 있는지 평가하는 등의 용도로 정규 표현식을 사용할 수 있습니다. 자세한 내용은 자바 가이드의 정규 표현식을 참조하세요.

RegularExpressionProtection의 가장 일반적인 용도는 JSON 및 XML 페이로드의 악성 콘텐츠를 평가하는 것입니다.

정규 표현식으로 모든 콘텐츠 기반 공격을 제거할 수 없으며, 심층 방어를 위해 여러 메커니즘을 결합해야 합니다. 이 섹션에서는 콘텐츠 제외에 권장되는 몇 가지 패턴을 설명합니다.

제외 패턴 예시

정규 표현식은 정책의 XML 구성 파일에 XML로 인코딩되어야 합니다.

이름 정규 표현식
SQL 삽입
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))
서버 측 포함(SSI) 삽입
<!--#(include|exec|echo|config|printenv)\s+.*

XML 인코딩:

&lt;!--#(include|exec|echo|config|printenv)\s+.*
XPath 약식 구문 삽입
(/(@?[\w_?\w:\*]+(\[[^]]+\])*)?)+
XPath 확장 구문 삽입
/?(ancestor(-or-self)?|descendant(-or-self)?|following(-sibling))
자바스크립트 삽입
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*>

XML 인코딩:

&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*/\s*script\s*&gt;
자바 예외 삽입
.*?Exception in thread.*

XML 또는 JSON 페이로드를 사용해 요청에 Content-Type 헤더 설정

정규 표현식 보호 정책의 페이로드에는 다음 요소가 포함될 수 있습니다.

  • <XMLPayload> 요소: XML 페이로드에서 정보를 추출하고 제공된 정규 표현식을 기준으로 평가해야 함을 지정합니다.

    정책에 <XMLPayload>를 사용하는 경우 요청의 Content-Type 헤더는 application/xml 또는 text/xml 같은 XML 콘텐츠 유형이어야 합니다.

  • <JSONPayload> 요소: JSON 페이로드에서 정보를 추출하고 제공된 정규 표현식을 기준으로 평가해야 함을 지정합니다.

    정책에 <JSONPayload>를 사용하는 경우 요청의 Content-Type 헤더는 application/json 같은 JSON 콘텐츠 유형이어야 합니다.

일반적으로 XML 또는 JSON을 허용하도록 API를 설계합니다. 하지만 API가 둘 다 허용하는 시나리오가 있을 수 있습니다. 그런 다음 <XMLPayload><JSONPayload> 요소를 모두 사용하는 정규 표현식 보호 정책을 정의할 수 있습니다. Content-Type 헤더 값에 따라 특정 요청에 하나의 요소만 적용됩니다.

요소 참조

요소 참조는 RegularExpressionProtection 정책의 요소와 속성을 설명합니다.

<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1">
   <DisplayName>Regular Expression Protection 1</DisplayName>
   <Source>response</Source>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <URIPath>
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </URIPath>
   <QueryParam name="a-query-param">
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </QueryParam>
   <Header name="a-header">
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </Header>
   <FormParam name="a-form-param">
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </FormParam>
   <Variable name="request.content">
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </Variable>
   <XMLPayload>
     <Namespaces>
       <Namespace prefix="apigee">http://www.apigee.com</Namespace>
     </Namespaces>
     <XPath>
       <Expression>/apigee:Greeting/apigee:User</Expression>
       <Type>string</Type>
       <Pattern>REGEX PATTERN</Pattern>
       <Pattern>REGEX PATTERN</Pattern>
     </XPath>
   </XMLPayload>
   <JSONPayload>
     <JSONPath>
       <Expression>$.store.book[*].author</Expression>
       <Pattern>REGEX PATTERN</Pattern>
       <Pattern>REGEX PATTERN</Pattern>
     </JSONPath>
    </JSONPayload>
</RegularExpressionProtection>

<RegularExpressionProtection> 속성

<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1">

다음 표는 모든 정책 상위 요소의 공통 속성에 대해 설명합니다.

속성 설명 기본 계정 현재 상태
name

정책의 내부 이름입니다. name 속성의 값에는 문자, 숫자, 공백, 하이픈, 밑줄, 마침표가 포함될 수 있습니다. 이 값은 255자(영문 기준)를 초과할 수 없습니다.

원하는 경우 <DisplayName> 요소를 사용하여 관리 UI 프록시 편집기의 정책에 다른 자연어 이름을 사용하여 정책에 라벨을 지정합니다.

N/A 필수
continueOnError

정책이 실패할 경우 오류가 반환되도록 하려면 false로 설정합니다. 이는 대부분의 정책에서 예상되는 동작입니다.

정책이 실패해도 흐름 실행이 계속되도록 하려면 true로 설정합니다.

false 선택사항
enabled

정책을 시행하려면 true로 설정합니다.

정책을 중지하려면 false로 설정합니다. 정책이 흐름에 연결되어 있어도 정책이 시행되지 않습니다.

true 선택사항
async

이 속성은 지원이 중단되었습니다.

false 지원 중단됨

<DisplayName> 요소

name 속성 외에도 이 요소를 사용하여 관리 UI 프록시 편집기의 정책에 다른 자연어 이름으로 라벨을 지정합니다.

<DisplayName>Policy Display Name</DisplayName>
기본 계정

N/A

이 요소를 생략하면 정책 name 속성 값이 사용됩니다.

현재 상태 선택사항
유형 문자열

<Source> 요소

정보를 추출해야 하는 메시지를 나타냅니다.

<Source> 요소가 생략된 경우 기본값은 message입니다. 예를 들면 <Source>message</Source>입니다. message로 설정하면 정책은 요청 흐름에 연결될 때 요청 메시지를 소스로 사용합니다. 마찬가지로 정책은 응답 흐름에 연결될 때 응답 메시지를 사용합니다.

소스 메시지를 확인할 수 없거나 메시지 이외의 유형으로 확인되는 경우 정책에서 오류를 반환합니다.

<Source>response</Source>
기본값: N/A
현재 상태: 선택사항
유형: 문자열

<IgnoreUnresolvedVariables> 요소

확인할 수 없는 변수가 발견되면 정책이 오류를 반환할지 결정합니다.

false(기본값)로 설정하면 확인할 수 없는 변수가 발생할 때 정책에서 오류를 반환합니다. true로 설정하면 확인되지 않은 변수가 빈 문자열(Null)로 처리됩니다.

<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
기본값: false
현재 상태: 선택사항
유형: 불리언

<URIPath> 요소

요청 URI 경로에서 정보를 추출하고 제공된 정규 표현식과 비교하여 평가하도록 지정합니다. 매칭할 정규 표현식 패턴을 지정하는 <Pattern> 요소를 하나 이상 제공해야 합니다.

<URIPath>
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</URIPath>
기본값: N/A
현재 상태: 선택사항
유형: N/A

<QueryParam> 요소

요청 쿼리 매개변수에서 정보를 추출하고 제공된 정규 표현식과 비교하여 평가하도록 지정합니다. 매칭할 정규 표현식 패턴을 지정하는 <Pattern> 요소를 하나 이상 제공해야 합니다.

<QueryParam name="a-query-param">
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</QueryParam>
기본값: N/A
현재 상태: 선택사항
유형: N/A

특성

속성 설명 기본 계정 현재 상태
이름 제공된 정규 표현식에 대한 평가를 위해 정보를 추출해야 하는 요청 쿼리 매개변수의 이름입니다. N/A 필수

<Header> 요소

요청 및 응답 헤더에서 정보를 추출하고 제공된 정규 표현식과 비교하여 평가하도록 지정합니다. 매칭할 정규 표현식 패턴을 지정하는 <Pattern> 요소를 하나 이상 제공해야 합니다.

<Header name="a-header">
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</Header>
기본값: N/A
현재 상태: 선택사항
유형: N/A

특성

속성 설명 기본 계정 현재 상태
이름

제공된 정규 표현식과의 비교 평가를 위해 정보를 추출해야 하는 요청 및 응답 헤더의 이름입니다.

N/A 필수

<FormParam> 요소

요청 양식 매개변수에서 정보를 추출하고 제공된 정규 표현식과 비교하여 평가하도록 지정합니다. 매칭할 정규 표현식 패턴을 지정하는 <Pattern> 요소를 하나 이상 제공해야 합니다.

<FormParam name="a-form-param">
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>     
</FormParam>
기본값: N/A
현재 상태: 선택사항
유형: N/A

특성

속성 설명 기본 계정 현재 상태
이름

제공된 정규 표현식과의 비교 평가를 위해 정보를 추출해야 하는 요청 양식 매개변수의 이름입니다.

N/A 필수

<Variable> 요소

지정된 변수에서 정보를 추출하고 제공된 정규 표현식과 비교하여 평가하도록 지정합니다.

<Variable name="request.content">
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</Variable>
기본값: N/A
현재 상태: 선택사항
유형: N/A

특성

속성 설명 기본 계정 현재 상태
이름

제공된 정규 표현식과의 비교 평가를 위해 정보를 추출해야 하는 변수의 이름입니다.

N/A 필수

<XMLPayload> 요소

XML 페이로드에서 정보를 추출하고 제공된 정규 표현식과 비교하여 평가하도록 지정합니다.

<XMLPayload>
   <Namespaces>
      <Namespace prefix="apigee">http://www.apigee.com</Namespace>
   </Namespaces>
   <XPath>
      <Expression>/apigee:Greeting/apigee:User</Expression>
      <Type>string</Type>
      <Pattern>REGEX PATTERN</Pattern>
      <Pattern>REGEX PATTERN</Pattern>
   </XPath>
</XMLPayload>
기본값: N/A
현재 상태: 선택사항
유형: N/A

<XMLPayload>/<Namespaces> 요소

XPath 평가에 사용할 네임스페이스를 지정합니다.

<XMLPayload>
   <Namespaces>
      <Namespace prefix="apigee">http://www.apigee.com</Namespace>
   </Namespaces>
   <XPath>
      <Expression>/apigee:Greeting/apigee:User</Expression>
      <Type>string</Type>
      <Pattern>REGEX PATTERN</Pattern>
      <Pattern>REGEX PATTERN</Pattern>
   </XPath>
</XMLPayload>
기본값: N/A
현재 상태: 선택사항
유형: 문자열

<XML페이로드>/<네임스페이스>/<네임스페이스> 요소

XPath 평가에 사용할 각 네임스페이스를 지정합니다.
<Namespaces>
   <Namespace prefix="apigee">http://www.apigee.com</Namespace>
</Namespaces>
기본값: N/A
현재 상태: 선택사항
유형: 문자열

특성

속성 설명 기본 계정 현재 상태
프리픽스

특정 네임스페이스를 한정하는 데 도움이 되는 프리픽스를 제공합니다.

N/A 필수

<XMLPayload>/<XPath> 요소

평가할 XPath를 지정합니다.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
기본값: N/A
현재 상태: 선택사항
유형: N/A

<XMLPayload>/<XPath>/<Expression> 요소

변수에 정의된 XPath 표현식을 지정합니다. XPath 1.0 표현식만 지원됩니다. 예를 들어 <Expression>/company/employee[@age>=$request.header.age]</Expression>은 연령이 request.header.age에 지정된 값보다 크거나 같은 직원의 세부정보를 추출합니다.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
기본값: N/A
현재 상태: 선택사항
유형: 문자열

<XMLPayload>/<XPath>/<Type> 요소

데이터 유형을 지정합니다.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
기본값: 문자열
현재 상태: 선택사항
유형: 문자열
유효한 값:

문자열. 유효한 값은 string, boolean, int, long, float, double, nodeset 등입니다.

<XMLPayload>/<XPath>/<Pattern> 요소

정규 표현식 패턴을 정의합니다. <Pattern> 요소의 정규 표현식에 XML 예약 문자(", &, ', <, 또는 .)가 포함되어 있으면 먼저 이를 XML로 인코딩한 후에 포함해야 합니다.

<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
기본값: N/A
현재 상태: 필수
유형: 문자열

<JSONPayload> 요소

JSON 페이로드에서 정보를 추출하고 제공된 정규 표현식과 비교하여 평가하도록 지정합니다.

<JSONPayload>
   <JSONPath>
      <Expression>$.store.book[*].author</Expression>
      <Pattern>REGEX PATTERN</Pattern>
      <Pattern>REGEX PATTERN</Pattern>
   </JSONPath>
</JSONPayload>
기본값: N/A
현재 상태: 선택사항
유형: N/A

특성

속성 설명 기본 계정 현재 상태
escapeSlashCharacter

<JSONPath>/<Pattern>의 정규 표현식에서 슬래시(/) 문자를 이스케이프 처리하려면 true로 설정합니다.

true 선택사항

<JSONPayload>/<JSONPath>/<Expression> 요소

변수에 정의된 JSONPath 표현식을 지정합니다.

<JSONPath>
   <Expression>$.store.book[*].author</Expression>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</JSONPath>
기본값: N/A
현재 상태: 선택사항
유형: 문자열

<JSONPayload>/<JSONPath>/<Pattern> 요소

정규 표현식 패턴을 정의합니다. <Pattern> 요소의 정규 표현식에 XML 예약 문자(", &, ', <, 또는 .)가 포함되어 있으면 먼저 이를 XML로 인코딩한 후에 포함해야 합니다.

<JSONPath>
   <Expression>$.store.book[*].author</Expression>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</JSONPath>
기본값: N/A
현재 상태: 필수
유형: 문자열

오류 참조

이 섹션에서는 정책이 오류를 트리거할 때 Edge에서 설정한 오류 코드, 오류 메시지, 오류 변수를 설명합니다. 오류를 처리하기 위해 오류 규칙을 개발 중인 경우, 이 정보는 중요합니다. 오류를 캡처하고 자체 커스텀 오류를 발생시키려면 정책 루트 요소에서 continueOnError="true" 속성을 설정합니다. 자세한 내용은 정책 오류에 대해 알아야 할 사항오류 처리를 참조하세요.

에지 정책에서 반환되는 오류는 오류 코드 참조에 설명된 일관된 형식을 따릅니다.

런타임 오류

이러한 오류는 정책이 실행될 때 발생할 수 있습니다.

오류 코드 메시지
ExecutionFailed RegularExpressionProtection StepDefinition {0} 실행할 수 없음. 이유: {1}
InstantiationFailed RegularExpressionProtection StepDefinition {0} 인스턴스화할 수 없음.
NonMessageVariable {0} 변수가 메시지로 확인되지 않습니다.
SourceMessageNotAvailable {0} 메시지는 RegularExpressionProtection StepDefinition {1}에서 사용할 수 없음
ThreatDetected {0}에서 정규 표현식 위협이 감지됨: 정규식: {1} 입력: {2}
VariableResolutionFailed {0} 변수를 확인할 수 없음

배포 오류

오류 코드 메시지 해결
CannotBeConvertedToNodeset RegularExpressionProtection {0}: xpath {1}의 결과를 노드 집합으로 변환할 수 없습니다. 컨텍스트 {2}
DuplicatePrefix RegularExpressionProtection {0}: 중복된 접두사 {1}
EmptyJSONPathExpression RegularExpressionProtection {0}: 빈 JSONPath 표현식
EmptyXPathExpression RegularExpressionProtection {0}: 빈 XPath 표현식
InvalidRegularExpression RegularExpressionProtection {0}: 잘못된 정규 표현식 {1}, 컨텍스트 {2}
JSONPathCompilationFailed RegularExpressionProtection {0}: jsonpath {1} 컴파일할 수 없음. 컨텍스트 {2}
NONEmptyPrefixMappedToEmptyURI RegularExpressionProtection {0}: 빈 URI에 비어 있지 않은 프리픽스 {1} 매핑할 수 없음
NoPatternsToEnforce RegularExpressionProtection {0}: {1}에 적용할 패턴이 없습니다.
NothingToEnforce RegularExpressionProtection {0}: URIPath, QueryParam, Header, FormParam, XML 로드, JSON페이 중 하나 이상이 필수임
XPathCompilationFailed RegularExpressionProtection {0}: xpath {1} 컴파일할 수 없음. 컨텍스트 {2}

오류 변수

이러한 변수는 이 정책으로 오류가 트리거될 때 설정됩니다. 자세한 내용은 정책 오류에 대해 알아야 할 사항을 참조하세요.

변수 각 항목의 의미는 다음과 같습니다.
fault.name="fault_name" fault_name은 위 표에 나열된 오류의 이름입니다. fault.name Matches "ThreatDetected"
regularexpressionprotection.policy_name.failed policy_name은 오류를 발생시킨 정책의 사용자 지정 이름입니다. regularexpressionprotection.Regular-Expressions-Protection-1.failed = true

스키마

관련 주제

JSON 위협 방지 정책

XML 위협 방지 정책