Политика RegularExpressionProtection

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

Что

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

Видео

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

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

Образцы

GitHub

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

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

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

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

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

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

Имя Регулярное выражение
SQL-инъекция
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))
Внедрение включения на стороне сервера
<!--#(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>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Н/Д

Атрибуты

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

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

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

Элемент <ФормаПарам>

Указывает, что информацию необходимо извлечь из параметра формы запроса и оценить по предоставленным регулярным выражениям. Вы должны предоставить хотя бы один элемент <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>/<Пространства имен>

Указывает пространства имен, которые будут использоваться при оценке 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>/<Пространства имен>/<Пространство имен>

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

Атрибуты

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

Установите значение 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-угроз