Правило RegularExpressionProtection

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

Что

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

Видео

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

Видео Описание
Защита от атак с внедрением кода SQL (New Edge) Защититесь от атак с использованием внедрения кода 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;.

Кроме того, если в регулярном выражении есть косые черты (/), их нужно экранировать, задав атрибуту "регулярное выражение" <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 во время выполнения, чтобы выявлять распространенные угрозы на уровне контента, соответствующие определенным шаблонам.

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

Чаще всего RegularExpressionProtection используется для проверки полезных нагрузок JSON и XML на наличие вредоносного контента.

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

Примеры шаблонов исключений

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

Название Регулярное выражение
Внедрение кода SQL
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))
Внедрение Server-Side Includes
<!--#(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>

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

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

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

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

Элемент <IgnoreUnresolvedVariables>

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

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

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

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

Атрибуты

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

Элемент <Header>

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

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

Атрибуты

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

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

Н/Д Обязательно

Элемент <FormParam>

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

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

Атрибуты

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

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

Н/Д Обязательно

Элемент <Variable>

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

<Variable name="request.content">
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</Variable>
По умолчанию: Н/Д
Присутствие Необязательно
Тип: Н/Д

Атрибуты

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

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

Н/Д Обязательно

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

Строка. Допустимые значения: 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>.

true Необязательно

Элемент <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, имеют единый формат, описанный в справочнике кодов ошибок.

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

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

Код ошибки Сообщение
ExecutionFailed Не удалось выполнить шаг определения защиты с помощью регулярных выражений {0}. Причина: {1}
InstantiationFailed Не удалось создать экземпляр RegularExpressionProtection StepDefinition {0}
NonMessageVariable Переменная {0} не преобразуется в сообщение
SourceMessageNotAvailable Сообщение {0} недоступно для шага RegularExpressionProtection {1}
ThreatDetected В {0} обнаружена угроза, связанная с регулярным выражением: regex: {1} input: {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}: непустой префикс {1} нельзя сопоставить с пустым URI
NoPatternsToEnforce RegularExpressionProtection {0}: в {1} нет шаблонов для применения
NothingToEnforce 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"