Вы просматриваете документацию 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><\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> </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 как <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> .
Кроме того, если ваше регулярное выражение содержит косые черты (/), необходимо экранировать их, установив атрибут ` 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-кодировка: <!--#(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-кодировка: <\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> |
| Внедрение исключений в 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 | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент | Н/Д | Необходимый |
continueOnError | Установите значение Установите значение | ЛОЖЬ | Необязательный |
enabled | Установите значение Установите значение | истинный | Необязательный |
async | Этот атрибут устарел. | ЛОЖЬ | Устарело |
Элемент <DisplayName>
Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.
<DisplayName>Policy Display Name</DisplayName>
| По умолчанию | Н/Д Если вы опустите этот элемент, будет использовано значение атрибута |
|---|---|
| Присутствие | Необязательный |
| Тип | Нить |
<Исходный> элемент
Указывает сообщение, из которого необходимо извлечь информацию.
Если элемент <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>
| По умолчанию: | нить |
| Присутствие: | Необязательный |
| Тип: | Нить |
| Допустимые значения: | Строка. Допустимые значения: |
<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 | Установите значение | истинный | Необязательный |
<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} | build |
| Дубликат префикса | RegularExpressionProtection {0}: повторяющийся префикс {1}. | build |
| Пустое выражениеJSONPathExpression | RegularExpressionProtection {0}: пустое выражение JSONPath. | build |
| Пустое выражениеXPathExpression | RegularExpressionProtection {0}: пустое выражение XPath. | build |
| ИнвалидРегулярноеВыражение | RegularExpressionProtection {0}: неверное регулярное выражение {1}, контекст {2} | build |
| Ошибка компиляции JSONPath | RegularExpressionProtection {0}: не удалось скомпилировать jsonpath {1}. Контекст {2} | build |
| NONEmptyPrefixMappedToEmptyURI | RegularExpressionProtection {0}: непустой префикс {1} не может быть сопоставлен с пустым uri. | build |
| NoPatternsToEnforce | RegularExpressionProtection {0}: в {1} нет шаблонов, требующих принудительного применения. | build |
| НичегоToEnforce | RegularExpressionProtection {0}: по крайней мере один из URIPath, QueryParam, Header, FormParam, XMLPayload, JSONPayload является обязательным. | build |
| XPathCompilationFailed | RegularExpressionProtection {0}: не удалось скомпилировать XPath {1}. Контекст {2} | build |
Переменные неисправности
Эти переменные устанавливаются, когда эта политика вызывает ошибку. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .
| Переменные | Где | Пример |
|---|---|---|
fault.name=" fault_name " | fault_name — это имя ошибки, как указано в таблице выше. | fault.name Matches "ThreatDetected" |
regularexpressionprotection. policy_name .failed | policy_name — указанное пользователем имя политики, вызвавшей ошибку. | regularexpressionprotection.Regular-Expressions-Protection-1.failed = true |