Вы просматриваете документацию 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><\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*>
Кроме того, если ваше регулярное выражение содержит косую черту (/), вы должны экранировать ее, установив для атрибута <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-кодировка: <!--#(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>
По умолчанию: | Н/Д |
Присутствие: | Необязательный |
Тип: | Н/Д |
Атрибуты
Атрибут | Описание | По умолчанию | Присутствие |
---|---|---|---|
имя | Имя заголовка запроса и ответа, из которого необходимо извлечь информацию для оценки по предоставленным регулярным выражениям. | Н/Д | Необходимый |
Элемент <ФормаПарам>
Указывает, что информацию необходимо извлечь из параметра формы запроса и оценить по предоставленным регулярным выражениям. Вы должны предоставить хотя бы один элемент <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>
По умолчанию: | нить |
Присутствие: | Необязательный |
Тип: | Нить |
Допустимые значения: | Нить. Допустимые значения включают |
Элемент <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Персонаж | Установите значение | истинный | Необязательный |
Элемент <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 |