Esta página se aplica a Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.
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 la política muestra una falla.
Esta política es una política extensible, y el uso de esta política puede tener implicaciones de costo o uso, según tu licencia de Apigee. Para obtener información sobre los tipos de políticas y sus implicaciones de uso, consulta Tipos de políticas.
Videos
Mira el siguiente video para obtener más información sobre la política de protección contra expresiones regulares.
Video | Descripción |
---|---|
Protección contra los ataques de inyección de SQL | Protege contra ataques de inyección SQL con la política de protección de expresiones regulares en la IU de Apigee |
Ejemplos
GitHub
En el ejemplo de protección de regex en GitHub, se ilustra cómo atrapar los posibles ataques de inserción de SQL emitidos a través de un parámetro de búsqueda que podría contener código malicioso en una etiqueta <script>
.
En el ejemplo, también 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"> <Source>request</Source> <JSONPayload escapeSlashCharacter="true"> <JSONPath> <Expression>$</Expression> <Pattern><![CDATA[ <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> ]]></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 unirla en una sección CDATA (datos de carácter), como se muestra en el ejemplo anterior, o codificar en XML los caracteres reservados: por ejemplo, mediante el reemplazo de <
por <
y >
por >
.
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>
Verificaciones de parámetros de formularios
<RegularExpressionProtection name="REP-Formparam"> <Source>request</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <FormParam name="firstname"> <Pattern><![CDATA[[-+=$%&]]]></Pattern> </FormParam> <FormParam name="lastname"> <Pattern><![CDATA[[-+=$%&]]]></Pattern> </FormParam> </RegularExpressionProtection>
Esta configuración de la política RegularExpressionProtection evaluará los parámetros del formulario para detectar caracteres especiales dentro del conjunto [-+=$%&]
.
Esta política solo tendrá efecto cuando el encabezado content-type de la solicitud sea application/x-www-form-urlencoded
. La configuración de la política usa una sección CDATA (datos de caracteres) para unir las expresiones regulares, debido a la presencia del carácter &, que es especial en XML.
Acerca de la política de protección contra expresiones regulares
Apigee te permite configurar expresiones regulares que se pueden evaluar en comparación con el tráfico de API en el entorno de ejecución para identificar las amenazas comunes a nivel de contenido que sigan 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. Consulta también Antipatrón: Usa cuantificadores expansivos en la política RegularExpressionProtection.
Nombre | 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*> |
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 | Configuración predeterminada | Presence |
---|---|---|---|
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 |
false | Opcional |
enabled |
Configúralo como Configúralo como |
true | Opcional |
async |
Este atributo dejó de estar disponible. |
false | Obsoleto |
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>
Configuración predeterminada |
N/A Si omites este elemento, se usa el valor del atributo |
---|---|
Presence | 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: | false |
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 | Presence |
---|---|---|---|
name | 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 | Presence |
---|---|---|---|
name |
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 | Presence |
---|---|---|---|
name |
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 | Presence |
---|---|---|---|
name |
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 que se usará 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 | Presence |
---|---|---|---|
prefijo |
Proporciona un prefijo para ayudar a calificar un espacio de nombres determinado. |
N/A | Obligatorio |
Elemento <XMLPayload>/<XPath>
Especifica la XPath que se 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 de salida deseado.
Por lo general, usarás “string” o “conjunto de nodos”. Usa "string" si estás seguro de que tu consulta xpath generará como máximo un solo valor, o si deseas verificar como máximo un solo valor. Si tu consulta de xpath puede mostrar varios valores, especifica “nodeset” para verificarlos todos.
Por ejemplo, considera la expresión de XPath //*/@*
. Coincide con todos los atributos de todos los elementos. Si especificas “string” como Type
, Apigee convertirá el resultado de esta consulta en una sola string. Este será el valor de uno de los atributos en uno de los elementos del documento XML, pero no se definirá qué atributo ni qué elemento. Luego, Apigee aplicará una coincidencia de patrones con el valor de ese único atributo. Es probable que esto no sea lo que quieres.
Por el contrario, si especificas “nodeset” como Type
para esa expresión de XPath, Apigee realizará una coincidencia de patrones con cada uno de los valores de atributo en cada elemento del documento XML.
<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: |
Una de estas palabras clave: |
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 | Presence |
---|---|---|---|
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 de error y los mensajes que se muestran, y las variables de falla que establece Apigee cuando esta política activa un error. Esta información es importante para saber si estás desarrollando reglas de fallas con el propósito de manejar fallas. Si quieres capturar un error y generar tu propio error personalizado, establece el atributo continueOnError="true"
en el elemento raíz de la política.
Para obtener más información, consulta Lo que necesitas saber sobre los errores de políticas y Controla fallas.
Errores de entorno de ejecución
Estos errores pueden producirse cuando se ejecuta la política.
Código de error | Mensaje |
---|---|
ExecutionFailed |
Failed to execute the RegularExpressionProtection StepDefinition {0}. Reason: {1} |
InstantiationFailed |
Failed to instantiate the RegularExpressionProtection StepDefinition {0} |
NonMessageVariable |
Variable {0} does not resolve to a Message |
SourceMessageNotAvailable |
{0} message is not available for RegularExpressionProtection StepDefinition {1} |
ThreatDetected |
Regular Expression Threat Detected in {0}: regex: {1} input: {2} |
VariableResolutionFailed |
Failed to resolve variable {0} |
Errores en la implementación
Código de error | Mensaje | Corregir |
---|---|---|
CannotBeConvertedToNodeset |
RegularExpressionProtection {0}: Result of xpath {1} cannot be converted to nodeset.
Context {2} |
build |
DuplicatePrefix |
RegularExpressionProtection {0}: Duplicate prefix {1} |
build |
EmptyJSONPathExpression |
RegularExpressionProtection {0}: Empty JSONPath expression |
build |
EmptyXPathExpression |
RegularExpressionProtection {0}: Empty XPath expression |
build |
InvalidRegularExpression |
RegularExpressionProtection {0}: Invalid Regular Expression {1}, Context {2} |
build |
JSONPathCompilationFailed |
RegularExpressionProtection {0}: Failed to compile jsonpath {1}. Context {2} |
build |
NONEmptyPrefixMappedToEmptyURI |
RegularExpressionProtection {0}: Non-empty prefix {1} cannot be mapped to empty
uri |
build |
NoPatternsToEnforce |
RegularExpressionProtection {0}: No patterns to enforce in {1} |
build |
NothingToEnforce |
RegularExpressionProtection {0}: at least one of URIPath, QueryParam, Header,
FormParam, XMLPayload, JSONPayload is mandatory |
build |
XPathCompilationFailed |
RegularExpressionProtection {0}: Failed to compile xpath {1}. Context {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 |
Esquemas
Temas relacionados
Política de protección contra amenazas de JSON
Política de protección contra amenazas de XML