Estás viendo la documentación de Apigee Edge.
Ve a la
Documentación de Apigee X. información
Qué
Extrae información de un mensaje (por ejemplo, URI de la ruta, parámetro de consulta, encabezado, parámetro de forma, variable, carga útil de XML o carga útil de JSON) y evalúa ese contenido en expresiones regulares predefinidas. Si alguna de las expresiones regulares especificadas se evalúa como verdadera, el mensaje se considera una amenaza y se rechaza.
Videos
Para obtener más información sobre la política de Protección contra expresiones regulares, mira los siguientes videos.
Video | Descripción |
---|---|
Protección contra ataques de inyección de SQL (Edge nuevo) | Protégete contra los ataques de inyección SQL con la política de protección contra expresiones regulares en la nueva IU de la experiencia de Edge. |
Protección contra ataques de inyección de SQL (Classic Edge) | Protégete contra los ataques de inyección SQL con la política de protección contra expresiones regulares en la IU clásica de Edge. |
Ejemplos
GitHub
En el ejemplo de protección de regex en GitHub, se ilustra cómo atrapar los posibles ataques de inyección de SQL emitidos a través de un parámetros de búsqueda. Además, en el ejemplo, se muestra una buena práctica para configurar un estado de error genérico 400 a fin de evitar que los hackers obtengan información útil de la respuesta.
JavaScript incluye protección contra ataques
<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>
En el ejemplo anterior, se ilustra cómo usar la política RegularExpressionProtection a fin de evaluar las cargas útiles de JSON para JavaScript mediante ataques. En particular, el contenido extraído por <JSONPath>
/<Expression>
se evalúa en función de la expresión regular en <JSONPath>
/<Pattern>
.
Si la expresión regular en tu <JSONPath>
/<Pattern>
incluye caracteres reservados para XML (", &, ", < o "."), debes codificarla en formato XML antes de incluirla en el archivo de configuración XML de la política. Por ejemplo, en la muestra anterior, la expresión regular <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*>
se codificó en formato XML como <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*>
.
Además, si la expresión regular incluye barras diagonales (/), debes marcarlas con la configuración del atributo <JSONPayload>
escapeSlashCharacter
en true
.
Coincidencia sin distinción entre mayúsculas y minúsculas
Es un caso de uso común que hace una coincidencia que no distingue entre mayúsculas y minúsculas. A continuación, te mostramos un ejemplo de cómo puedes hacerlo en una expresión regular mediante la construcción (?i)
. En este ejemplo, por ejemplo, DELETE
, delete
y Delete
se evaluarán como verdadero.
<Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))</Pattern>
Acerca de la política de protección contra expresiones regulares
Apigee Edge te permite configurar expresiones regulares que pueden en comparación con el tráfico de API en el entorno de ejecución para identificar amenazas comunes a nivel de contenido que ciertos patrones.
Una expresión regular, o regex, es un conjunto de strings que especifican un patrón en una string. Las expresiones regulares permiten que el contenido se evalúe de manera programática para los patrones. Las expresiones regulares se pueden usar, por ejemplo, para evaluar una dirección de correo electrónico a fin de garantizar que esté estructurada de forma correcta. Para obtener más información, consulta Expresiones regulares en los instructivos de Java.
El uso más común de RegularExpressionProtection es la evaluación de las cargas útiles de JSON y XML para el contenido malicioso.
Ninguna expresión regular puede eliminar todos los ataques basados en el contenido y se deben combinar varios mecanismos para permitir la defensa en profundidad. En esta sección, se describen algunos patrones recomendados para excluir contenido.
Ejemplos de patrones de exclusión
Las expresiones regulares deben estar codificadas en XML en el archivo de configuración XML de la política.
Name | Expresión regular |
---|---|
Inyección de SQL |
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b)) |
Inyección del lenguaje Server Side Includes |
<!--#(include|exec|echo|config|printenv)\s+.* Codificado en XML: <!--#(include|exec|echo|config|printenv)\s+.* |
Inyección de la sintaxis abreviada de XPath |
(/(@?[\w_?\w:\*]+(\[[^]]+\])*)?)+ |
Inyección de la sintaxis expandida de XPath |
/?(ancestor(-or-self)?|descendant(-or-self)?|following(-sibling)) |
Inyección de JavaScript |
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> Codificado en XML: <\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> |
Inyección de excepciones de Java |
.*?Exception in thread.* |
Establece el encabezado Content-Type en una solicitud con una carga útil XML o JSON
La carga útil de la política de protección contra expresiones regulares puede incluir los siguientes elementos:
-
Elemento
<XMLPayload>
: especifica que la información se debe extraer de una carga útil de XML y evaluarse en la expresión regular proporcionada.Si usas
<XMLPayload>
en la política, el encabezadoContent-Type
de la solicitud debe ser un tipo de contenido XML, comoapplication/xml
otext/xml
. -
Elemento
<JSONPayload>
: especifica que la información se debe extraer de una carga útil de JSON y evaluar con la expresión regular proporcionada.Si usas
<JSONPayload>
en la política, el encabezadoContent-Type
de la solicitud debe ser un tipo de contenido JSON, comoapplication/json
.
Por lo general, se diseña una API para que acepte XML o JSON. Sin embargo, podría haber una situación en la que la API haya aceptado ambos. Luego, puedes definir una política de protección de expresiones regulares que use los elementos <XMLPayload>
y <JSONPayload>
.
Solo se aplicaría un elemento para una solicitud específica según el valor del encabezado Content-Type
.
Referencia del elemento
En la referencia del elemento, se describen los elementos y atributos de la política 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>
Atributos <RegularExpressionProtection>
<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1">
En la siguiente tabla, se describen los atributos que son comunes a todos los elementos principales de las políticas:
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
name |
El nombre interno de la política. El valor del atributo De forma opcional, usa el elemento |
N/A | Obligatorio |
continueOnError |
Configúralo como Configúralo como |
falso | Opcional |
enabled |
Configúralo como Configúralo como |
true | Opcional |
async |
Este atributo dejó de estar disponible. |
falso | Obsoleta |
Elemento <DisplayName>
Se usan además del atributo name
para etiquetar la política en el editor de proxy de la IU de administración con un nombre de lenguaje natural diferente.
<DisplayName>Policy Display Name</DisplayName>
Predeterminada |
N/A Si omites este elemento, se usa el valor del atributo |
---|---|
Presencia | Opcional |
Tipo | String |
Elemento <Source>
Indica el mensaje del cual se debe extraer la información.
Si se omite el elemento <Source>
, el valor predeterminado es message
. Por ejemplo, <Source>message</Source>
. Cuando se establece en message
, la política usa el mensaje de solicitud como fuente cuando se adjunta a un flujo de solicitud. Del mismo modo, la política usa el mensaje de respuesta cuando se adjunta un flujo de respuesta.
Si el mensaje fuente no se puede resolver o si se resuelve en un tipo que no es de mensaje, la política muestra un error.
<Source>response</Source>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | String |
Elemento <IgnoreUnresolvedVariables>
Determina si la política muestra un error cuando encuentra una variable que no se puede resolver.
Si se configura en false
(el valor predeterminado), la política muestra un error cuando se encuentra una variable no resuelta. Si se configura como true
, la variable sin resolver se trata como una string vacía (nula).
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
Predeterminado: | falso |
Presencia: | Opcional |
Tipo: | Booleano |
Elemento <URIPath>
Especifica que la información se debe extraer de la ruta del URI de solicitud y evaluarse con las expresiones regulares proporcionadas. Debes proporcionar al menos un elemento <Pattern>
que especifique un patrón de expresión regular para que coincida.
<URIPath> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </URIPath>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Elemento <QueryParam>
Especifica que la información se debe extraer del parámetros de búsqueda de solicitud y evaluarse con las expresiones regulares proporcionadas. Debes proporcionar al menos un elemento <Pattern>
que especifique un patrón de expresión regular para que coincida.
<QueryParam name="a-query-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </QueryParam>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
Nombre | Nombre del parámetro de búsqueda de la solicitud desde el que se debe extraer la información para la evaluación en función de las expresiones regulares proporcionadas. | N/A | Obligatorio |
Elemento <Header>
Especifica que la información se debe extraer de los encabezados de la solicitud y la respuesta y evaluarse con las expresiones regulares proporcionadas. Debes proporcionar al menos un elemento <Pattern>
que especifique un patrón de expresión regular para que coincida.
<Header name="a-header"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Header>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
Nombre |
Nombre del encabezado de la solicitud y la respuesta del que se debe extraer la información para evaluarla en función de las expresiones regulares proporcionadas. |
N/A | Obligatorio |
Elemento <FormParam>
Especifica que la información se debe extraer del parámetro de formato de la solicitud y evaluarse con las expresiones regulares proporcionadas. Debes proporcionar al menos un elemento <Pattern>
que especifique un patrón de expresión regular para que coincida.
<FormParam name="a-form-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </FormParam>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
Nombre |
Nombre del parámetro del formato de la solicitud desde el que se debe extraer la información para evaluar en función de las expresiones regulares proporcionadas. |
N/A | Obligatorio |
Elemento <Variable>
Especifica que la información se debe extraer de la variable determinada y evaluar con las expresiones regulares proporcionadas.
<Variable name="request.content"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Variable>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
Nombre |
Nombre de la variable de la que se debe extraer la información para la evaluación en función de las expresiones regulares proporcionadas. |
N/A | Obligatorio |
Elemento <XMLPayload>
Especifica que la información se debe extraer de una carga útil XML y evaluar con las expresiones regulares proporcionadas.
<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>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Elemento <XMLPayload>/<Namespaces>
Especifica los espacios de nombres que se usarán en la evaluación de 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>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | String |
Elemento <XMLPayload>/<Namespaces>/<Namespace>
Especifica cada espacio de nombres usarse en la evaluación de XPath.<Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | String |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
prefix |
Proporciona un prefijo para ayudar a calificar un espacio de nombres determinado. |
N/A | Obligatorio |
Elemento <XMLPayload>/<XPath>
Especifica la XPath que se debe evaluar.<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Elemento <XMLPayload>/<XPath>/<Expression>
Especifica la expresión XPath definida para la variable. Solo se admiten expresiones de XPath 1.0. Por ejemplo,<Expression>/company/employee[@age>=$request.header.age]</Expression>
extrae detalles para los empleados cuya edad es mayor o igual que el valor especificado en request.header.age
.<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | String |
Elemento <XMLPayload>/<XPath>/<Type>
Especifica el tipo de datos.<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Predeterminado: | string |
Presencia: | Opcional |
Tipo: | String |
Valores válidos: |
String. Los valores válidos incluyen |
Elemento <XMLPayload>/<XPath>/<Pattern>
Define el patrón de expresión regular. Si una expresión regular en tu elemento <Pattern>
incluye caracteres reservados para XML (", &, ", < o "."), debes codificarla en formato XML antes de incluirla.
<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Predeterminado: | N/A |
Presencia: | Obligatorio |
Tipo: | String |
Elemento <JSONPayload>
Especifica que la información se debe extraer de una carga útil de JSON y evaluar con las expresiones regulares proporcionadas.
<JSONPayload> <JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath> </JSONPayload>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
escapeSlashCharacter |
Configúralo como |
true | Opcional |
Elemento <JSONPayload>/<JSONPath>/<Expression>
Especifica la expresión JSONPath definida para la variable.
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
Predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | String |
Elemento <JSONPayload>/<JSONPath>/<Pattern>
Define el patrón de expresión regular. Si una expresión regular en tu elemento <Pattern>
incluye caracteres reservados para XML (", &, ", < o "."), debes codificarla en formato XML antes de incluirla.
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
Predeterminado: | N/A |
Presencia: | Obligatorio |
Tipo: | String |
Referencia de errores
En esta sección, se describen los códigos y mensajes de error que se muestran y las variables de fallas
que establece Edge cuando esta política activa un error. Esta información es importante para saber si estás desarrollando reglas de fallas para manejarlas. Si deseas capturar un error y generar tu propio error personalizado, configura el atributo continueOnError="true"
en el elemento raíz de la política.
Para obtener más información, consulta
Lo que debes saber sobre los errores de políticas y Cómo controlar las fallas.
Los errores que muestran las políticas de Edge siguen un formato coherente, como se describe en la Referencia de códigos de error.
Errores de entorno de ejecución
Estos errores pueden producirse cuando se ejecuta la política.
Código de error | Mensaje |
---|---|
ExecutionFailed | No se pudo ejecutar laRegularExpressionProtection StepDefinition {0}. Motivo: {1} |
InstantiationFailed | No se pudo crear una instancia de RegularExpressionProtection StepDefinition {0} |
NonMessageVariable | La variable {0} no se resuelve en un mensaje. |
SourceMessageNotAvailable | El mensaje {0} no está disponible para RegularExpressionProtection StepDefinition {1} |
ThreatDetected | Se detectó una expresión regular de amenazas en {0}: regex: {1} entrada: {2} |
VariableResolutionFailed | No se pudo resolver la variable {0} |
Errores en la implementación
Código de error | Mensaje | Corregir |
---|---|---|
CannotBeConvertedToNodeset | RegularExpressionProtection {0}: el resultado de xpath {1} no se puede convertir al nodeset. Contexto {2} | build |
DuplicatePrefix | RegularExpressionProtection {0}: prefijo duplicado {1} | build |
EmptyJSONPathExpression | RegularExpressionProtection {0}: Expresión JSONPath vacía | build |
EmptyXPathExpression | RegularExpressionProtection {0}: expresión XPath vacía | build |
InvalidRegularExpression | RegularExpressionProtection {0}: expresión regular no válida {1}, contexto {2} | build |
JSONPathCompilationFailed | RegularExpressionProtection{0}: No se pudo compilar jsonpath {1}. Contexto {2} | build |
NONEmptyPrefixMappedToEmptyURI | RegularExpressionProtection {0}: el prefijo no vacío {1} no se puede asignar al URI vacío | build |
NoPatternsToEnforce | RegularExpressionProtection {0}: sin patrones para aplicar en {1} | build |
NothingToEnforce | RegularExpressionProtection {0}: al menos uno de URIPath, QueryParam, Header, FormParam, XMLPayload y JSONPayload es obligatorio | build |
XPathCompilationFailed | RegularExpressionProtection {0}: no se pudo compilar xpath {1}. Contexto {2} | build |
Variables con fallas
Estas variables se establecen cuando esta política activa un error. Para obtener más información, consulta Qué debes saber sobre los errores de la política.
Variables | Donde | Ejemplo |
---|---|---|
fault.name="fault_name" |
fault_name es el nombre de la falla, como se indica en la tabla anterior. | fault.name Matches "ThreatDetected" |
regularexpressionprotection.policy_name.failed |
policy_name es el nombre especificado por el usuario de la política que generó la falla. | regularexpressionprotection.Regular-Expressions-Protection-1.failed = true |