Политика RegularExpressionProtection

Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee
X.info

Что

Извлекает информацию из сообщения (например, путь URI, параметр запроса, заголовок, параметр формы, переменная, полезная нагрузка XML или полезная нагрузка JSON) и сравнивает это содержимое с предопределенными регулярными выражениями. Если какое-либо из указанных регулярных выражений дает истинный результат, сообщение считается угрозой и отклоняется.

Видео

Посмотрите следующие видеоролики, чтобы узнать больше о политике защиты регулярных выражений.

Видео Описание
Защита от SQL-инъекций (новый уровень) Защититесь от SQL-инъекций, используя политику защиты от регулярных выражений в новом пользовательском интерфейсе Edge.
Защита от SQL-инъекций (Classic Edge) Защититесь от SQL-инъекций, используя политику защиты от регулярных выражений в классическом пользовательском интерфейсе Edge.

Образцы

GitHub

Пример regex-protection на GitHub демонстрирует, как перехватывать потенциальные SQL-инъекции, осуществляемые через параметры запроса. Кроме того, пример иллюстрирует хорошую практику установки общего статуса ошибки 400, чтобы предотвратить получение хакерами какой-либо полезной информации из ответа.

JavaScript включает защиту от атак

<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>

Приведенный выше пример иллюстрирует, как использовать политику RegularExpressionProtection для оценки JSON-данных на предмет атак с использованием JavaScript. В частности, содержимое, извлеченное с помощью <JSONPath> / <Expression> , сравнивается с регулярным выражением в <JSONPath> / <Pattern> .

Если регулярное выражение в вашем <JSONPath> / <Pattern> содержит зарезервированные XML-символы (", &, ', <, или .), его необходимо закодировать в XML, прежде чем включать в XML-файл конфигурации политики. Например, в приведенном выше примере регулярное выражение <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> было закодировано в XML как &lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&gt; .

Кроме того, если ваше регулярное выражение содержит косые черты (/), необходимо экранировать их, установив атрибут ` escapeSlashCharacter в значение true для <JSONPayload> `.

сопоставление без учета регистра

Часто используется сопоставление без учета регистра. Вот пример того, как это можно сделать в регулярном выражении с помощью конструкции (?i) . В этом примере, например, DELETE , delete и Delete будут оцениваться как true.

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

О политике защиты регулярных выражений

Apigee Edge позволяет настраивать регулярные выражения , которые могут быть проверены на API-трафике во время выполнения для выявления распространенных угроз на уровне контента, соответствующих определенным шаблонам.

Регулярное выражение , или сокращенно regex , — это набор строк, определяющих шаблон в строке. Регулярные выражения позволяют программно проверять содержимое на наличие шаблонов. Регулярные выражения можно использовать, например, для проверки адреса электронной почты, чтобы убедиться в его правильной структуре. Для получения дополнительной информации см. раздел «Регулярные выражения» в руководствах по Java.

Наиболее распространенное применение RegularExpressionProtection — это проверка JSON и XML-данных на наличие вредоносного содержимого.

Ни одно регулярное выражение не может полностью исключить атаки, основанные на содержании, и для обеспечения многоуровневой защиты следует комбинировать несколько механизмов. В этом разделе описаны некоторые рекомендуемые шаблоны для исключения содержимого.

Примеры схем исключения

Регулярные выражения должны быть закодированы в формате XML в конфигурационном XML-файле политики.

Имя Регулярное выражение
SQL-инъекция
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))
Внедрение include на стороне сервера
<!--#(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))
Внедрение JavaScript
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*>

XML-кодировка:

&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*/\s*script\s*&gt;
Внедрение исключений в Java
.*?Exception in thread.*

Установите заголовок Content-Type в запросе с полезной нагрузкой в ​​формате XML или JSON.

В состав политики защиты от регулярных выражений могут входить следующие элементы:

  • Элемент <XMLPayload> : указывает, что информация должна быть извлечена из XML-данных и сопоставлена ​​с предоставленным регулярным выражением.

    Если в политике используется <XMLPayload> , заголовок Content-Type запроса должен содержать XML-тип содержимого, например, application/xml или text/xml .

  • Элемент <JSONPayload> : указывает, что информация должна быть извлечена из JSON-данных и сопоставлена ​​с предоставленным регулярным выражением.

    Если в политике используется <JSONPayload> , заголовок Content-Type запроса должен содержать тип содержимого JSON, например, application/json .

Обычно API разрабатывается таким образом, чтобы принимать либо XML, либо JSON. Однако может возникнуть ситуация, когда 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> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

Установите значение false , чтобы отключить политику. Политика не будет применена, даже если она останется привязанной к потоку.

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

<Исходный> элемент

Указывает сообщение, из которого необходимо извлечь информацию.

Если элемент <Source> опущен, значение по умолчанию равно message . Например, <Source>message</Source> . Если установлено message , политика использует сообщение запроса в качестве источника при прикреплении к потоку запроса. Аналогично, политика использует сообщение ответа при прикреплении к потоку ответа.

Если исходное сообщение не может быть разрешено или если оно разрешается в тип, отличный от сообщения, политика возвращает ошибку.

<Source>response</Source>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Нить

элемент <IgnoreUnresolvedVariables>

Определяет, будет ли политика возвращать ошибку при обнаружении неразрешимой переменной.

Если установлено значение false (по умолчанию), политика возвращает ошибку при обнаружении неразрешимой переменной. Если установлено значение true , неразрешенная переменная рассматривается как пустая строка (Null).

<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
По умолчанию: ЛОЖЬ
Присутствие: Необязательный
Тип: Логический

элемент <URIPath>

Указывает, что информация должна быть извлечена из пути URI запроса и сопоставлена ​​с предоставленными регулярными выражениями. Необходимо указать как минимум один элемент <Pattern> , определяющий шаблон регулярного выражения для сопоставления.

<URIPath>
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</URIPath>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Н/Д

<QueryParam> элемент

Указывает, что информация должна быть извлечена из параметра запроса и сопоставлена ​​с предоставленными регулярными выражениями. Необходимо указать как минимум один элемент <Pattern> , определяющий шаблон регулярного выражения для сопоставления.

<QueryParam name="a-query-param">
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</QueryParam>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Н/Д

Атрибуты

Атрибут Описание По умолчанию Присутствие
имя Название параметра запроса, из которого необходимо извлечь информацию для проверки на соответствие предоставленным регулярным выражениям. Н/Д Необходимый

<Заголовок> элемент

Указывает, что информация должна быть извлечена из заголовков запроса и ответа и сопоставлена ​​с предоставленными регулярными выражениями. Необходимо предоставить как минимум один элемент <Pattern> , определяющий шаблон регулярного выражения для сопоставления.

<Header name="a-header">
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</Header>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Н/Д

Атрибуты

Атрибут Описание По умолчанию Присутствие
имя

Название заголовка запроса и ответа, из которого необходимо извлечь информацию для проверки соответствия предоставленным регулярным выражениям.

Н/Д Необходимый

<FormParam> элемент

Указывает, что информация должна быть извлечена из параметра формы запроса и проверена на соответствие предоставленным регулярным выражениям. Необходимо указать как минимум один элемент <Pattern> , определяющий шаблон регулярного выражения для сопоставления.

<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> элемент

Указывает, что информация должна быть извлечена из 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>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Н/Д

<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>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Нить

элемент <XMLPayload>/<Namespaces>/<Namespace>

Указывает каждое пространство имен, которое будет использоваться при вычислении XPath.
<Namespaces>
   <Namespace prefix="apigee">http://www.apigee.com</Namespace>
</Namespaces>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Нить

Атрибуты

Атрибут Описание По умолчанию Присутствие
префикс

Предоставляет префикс для уточнения заданного пространства имен.

Н/Д Необходимый

<XMLPayload>/<XPath> элемент

Указывает XPath, который необходимо оценить.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Н/Д

<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>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Нить

<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>
По умолчанию: Н/Д
Присутствие: Необходимый
Тип: Нить

элемент <JSONPayload>

Указывает, что информация должна быть извлечена из JSON-данных и проверена на соответствие предоставленным регулярным выражениям.

<JSONPayload>
   <JSONPath>
      <Expression>$.store.book[*].author</Expression>
      <Pattern>REGEX PATTERN</Pattern>
      <Pattern>REGEX PATTERN</Pattern>
   </JSONPath>
</JSONPayload>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Н/Д

Атрибуты

Атрибут Описание По умолчанию Присутствие
escapeSlashCharacter

Установите значение true , чтобы экранировать символы косой черты (/) в регулярных выражениях в <JSONPath> / <Pattern> .

истинный Необязательный

<JSONPayload>/<JSONPath>/<Expression> элемент

Указывает выражение JSONPath, определенное для переменной.

<JSONPath>
   <Expression>$.store.book[*].author</Expression>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</JSONPath>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Нить

<JSONPayload>/<JSONPath>/<Pattern> элемент

Определяет шаблон регулярного выражения. Если регулярное выражение в вашем элементе <Pattern> содержит зарезервированные XML-символы (", &, ', < или .), его необходимо закодировать в XML перед включением.

<JSONPath>
   <Expression>$.store.book[*].author</Expression>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</JSONPath>
По умолчанию: Н/Д
Присутствие: Необходимый
Тип: Нить

Ссылка на ошибку

В этом разделе описаны коды ошибок и возвращаемые сообщения, а также переменные ошибки, установленные Edge, когда эта политика вызывает ошибку. Эту информацию важно знать, если вы разрабатываете правила обработки ошибок. Если вы хотите зафиксировать ошибку и создать собственную пользовательскую ошибку, установите атрибут continueOnError="true" в корневом элементе политики. Дополнительные сведения см. в разделах Что нужно знать об ошибках политики и Обработка ошибок .

Ошибки, возвращаемые политиками Edge, имеют единообразный формат, как описано в справочнике по кодам ошибок .

Ошибки выполнения

Эти ошибки могут возникнуть при выполнении политики.

Код ошибки Сообщение
Выполнение не удалось Не удалось выполнить StepDefinition {0} RegularExpressionProtection. Причина: {1}
Создание экземпляра не удалось Не удалось создать экземпляр StepDefinition RegularExpressionProtection {0}.
NonMessageVariable Переменная {0} не преобразуется в сообщение
Исходное сообщениенедоступно Сообщение {0} недоступно для RegularExpressionProtection StepDefinition {1}
Обнаружена угроза В {0} обнаружена угроза регулярного выражения: регулярное выражение: {1} ввод: {2}
VariableResolutionFailed Не удалось разрешить переменную {0}.

Ошибки развертывания

Код ошибки Сообщение Исправить
Каннотбеконвертедтонодезет RegularExpressionProtection {0}: результат xpath {1} невозможно преобразовать в набор узлов. Контекст {2}
Дубликат префикса RegularExpressionProtection {0}: повторяющийся префикс {1}.
Пустое выражениеJSONPathExpression RegularExpressionProtection {0}: пустое выражение JSONPath.
Пустое выражениеXPathExpression RegularExpressionProtection {0}: пустое выражение XPath.
ИнвалидРегулярноеВыражение RegularExpressionProtection {0}: неверное регулярное выражение {1}, контекст {2}
Ошибка компиляции JSONPath RegularExpressionProtection {0}: не удалось скомпилировать jsonpath {1}. Контекст {2}
NONEmptyPrefixMappedToEmptyURI RegularExpressionProtection {0}: непустой префикс {1} не может быть сопоставлен с пустым uri.
NoPatternsToEnforce RegularExpressionProtection {0}: в {1} нет шаблонов, требующих принудительного применения.
НичегоToEnforce RegularExpressionProtection {0}: по крайней мере один из URIPath, QueryParam, Header, FormParam, XMLPayload, JSONPayload является обязательным.
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