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, una ruta de URI, un parámetro de consulta, un encabezado, un parámetro de formulario, una variable, una carga útil XML o una carga útil JSON) y evalúa ese contenido con 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 genera un error.
Esta política es una política extensible y su uso puede tener implicaciones en cuanto a costes o utilización, en función de tu licencia de Apigee. Para obtener información sobre los tipos de políticas y las implicaciones de uso, consulta Tipos de políticas.
Vídeos
Consulte el siguiente vídeo para obtener más información sobre la política de protección de expresiones regulares.
Vídeo | Descripción |
---|---|
Protección frente a ataques de inyección de SQL | Protégete frente a los ataques de inyección de SQL con la política de protección de expresiones regulares en la interfaz de usuario de Apigee. |
Ejemplos
GitHub
El ejemplo de protección con expresiones regulares en GitHub muestra cómo detectar posibles ataques de inyección de SQL emitidos a través de un parámetro de consulta que podría contener código malicioso en una etiqueta <script>
.
La muestra también ilustra una práctica recomendada para definir un estado de error 400 genérico para evitar que los hackers obtengan información útil de la respuesta.
Protección contra ataques de inclusión de JavaScript
<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>
El ejemplo anterior muestra cómo usar la política RegularExpressionProtection para evaluar cargas útiles JSON en busca de ataques de inclusión de JavaScript. En concreto, el contenido extraído por
<JSONPath>
/<Expression>
se evalúa en función de la
expresión regular de <JSONPath>
/<Pattern>
.
Si la expresión regular de su
<JSONPath>
/<Pattern>
incluye caracteres reservados de XML
(", &, ', < o >), debe envolverla en una sección CDATA (datos de caracteres), como se muestra
en el ejemplo anterior, o codificar en XML los caracteres reservados. Por ejemplo, puede sustituir
<
por <
y >
por >
.
Además, si tu expresión regular incluye barras inclinadas (/), debes aplicarles un carácter de escape asignando el valor true
al atributo <JSONPayload>
escapeSlashCharacter
.
Búsqueda de coincidencias sin distinguir entre mayúsculas y minúsculas
Es un caso de uso habitual buscar coincidencias sin distinguir entre mayúsculas y minúsculas. A continuación, se muestra un ejemplo de cómo puedes hacerlo en una expresión regular mediante la estructura (?i)
. En este ejemplo, DELETE
, delete
y Delete
se evaluarán como true.
<Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))</Pattern>
Comprobaciones de parámetros de formulario
<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 de formulario
para comprobar si se producen 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 envolver las expresiones regulares, debido a la presencia del carácter &, que es especial en XML.
Acerca de la política de protección de expresiones regulares
Apigee te permite configurar expresiones regulares que se pueden evaluar en el tráfico de las APIs en tiempo de ejecución para identificar amenazas comunes a nivel de contenido que siguen determinados patrones.
Una expresión regular, o regex, es un conjunto de cadenas que especifican un patrón en una cadena. Las expresiones regulares permiten evaluar el contenido de forma programática para detectar patrones. Las expresiones regulares se pueden usar, por ejemplo, para evaluar una dirección de correo electrónico y asegurarse de que tiene una estructura adecuada. Para obtener más información, consulta Expresiones regulares en los tutoriales de Java.
El uso más habitual de RegularExpressionProtection es la evaluación de cargas útiles JSON y XML para detectar contenido malicioso.
Ninguna expresión regular puede eliminar todos los ataques basados en contenido, por lo que se deben combinar varios mecanismos para habilitar una 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 codificarse en XML en el archivo de configuración XML de la política. Consulta también Antipatrón: utilizar 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 de inclusión del lado del servidor |
<!--#(include|exec|echo|config|printenv)\s+.* Codificación XML: <!--#(include|exec|echo|config|printenv)\s+.* |
Inyección de sintaxis abreviada de XPath |
(/(@?[\w_?\w:\*]+(\[[^]]+\])*)?)+ |
Inyección de sintaxis expandida de XPath |
/?(ancestor(-or-self)?|descendant(-or-self)?|following(-sibling)) |
Inyección de JavaScript |
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> Codificación XML: <\s*script\b[^>]*>[^<]+<\s*/\s*script\s*> |
Definir el encabezado Content-Type en una solicitud con una carga útil XML o JSON
La carga útil de la política de protección de expresiones regulares puede incluir los siguientes elementos:
-
Elemento
<XMLPayload>
: especifica que se debe extraer información de una carga útil XML y evaluarla con 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 se debe extraer información de una carga útil de JSON y evaluarla 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
.
Normalmente, se diseña una API para que acepte XML o JSON. Sin embargo, podría darse el caso de que la API aceptara ambos. Después, puedes definir una política de protección con expresiones regulares que use los elementos <XMLPayload>
y <JSONPayload>
.
Solo se aplicaría un elemento a una solicitud específica en función del valor del encabezado Content-Type
.
Referencia de elemento
En la referencia de elementos 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>
<RegularExpressionProtection> atributos
<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 superiores de la política:
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
name |
El nombre interno de la política. El valor del atributo Opcionalmente, usa el elemento |
N/A | Obligatorio |
continueOnError |
Asigna el valor Asigna el valor |
falso | Opcional |
enabled |
Asigna el valor Selecciona |
true | Opcional |
async |
Este atributo está obsoleto. |
falso | Obsoleto |
Elemento <DisplayName>
Úsalo junto con el atributo name
para etiquetar la política en el editor de proxy de la interfaz de gestión con un nombre diferente en lenguaje natural.
<DisplayName>Policy Display Name</DisplayName>
Predeterminado |
N/A Si omite este elemento, se usará el valor del atributo |
---|---|
Presencia | Opcional |
Tipo | Cadena |
Elemento <Source>
Indica el mensaje del que se debe extraer la información.
Si se omite el elemento <Source>
, el valor predeterminado es message
. Por ejemplo, <Source>message</Source>
. Si se le asigna el valor message
, la política usa el mensaje de solicitud como fuente cuando se adjunta a un flujo de solicitudes. Del mismo modo, la política usa el mensaje de respuesta cuando se adjunta a un flujo de respuesta.
Si no se puede resolver el mensaje de origen o se resuelve en un tipo que no es de mensaje, la política devuelve un error.
<Source>response</Source>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | Cadena |
Elemento <IgnoreUnresolvedVariables>
Determina si la política devuelve un error cuando encuentra una variable que no se puede resolver.
Si se le asigna el valor false
(el predeterminado), la política devuelve un error cuando se encuentra una variable que no se puede resolver. Si se define como true
, la variable sin resolver se trata como una cadena vacía (nula).
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
Valor predeterminado: | falso |
Presencia: | Opcional |
Tipo: | Booleano |
Elemento <URIPath>
Especifica que la información debe extraerse de la ruta del URI de la solicitud y evaluarse con las expresiones regulares proporcionadas. Debe proporcionar al menos un elemento <Pattern>
que especifique un patrón de expresión regular con el que coincidir.
<URIPath> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </URIPath>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Elemento <QueryParam>
Especifica que la información debe extraerse del parámetro de consulta de la solicitud y evaluarse con las expresiones regulares proporcionadas. Debe proporcionar al menos un elemento <Pattern>
que especifique un patrón de expresión regular con el que coincidir.
<QueryParam name="a-query-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </QueryParam>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
name | Nombre del parámetro de consulta de la solicitud del que se debe extraer información para evaluarla con las expresiones regulares proporcionadas. | N/A | Obligatorio |
Elemento <Header>
Especifica que la información debe extraerse de los encabezados de solicitud y respuesta, y
evaluarse en función de las expresiones regulares proporcionadas. Debe proporcionar al menos un elemento <Pattern>
que especifique un patrón de expresión regular con el que coincidir.
<Header name="a-header"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Header>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
name |
Nombre del encabezado de solicitud y respuesta del que se debe extraer información para evaluarla con las expresiones regulares proporcionadas. |
N/A | Obligatorio |
Elemento <FormParam>
Especifica que la información debe extraerse del parámetro del formulario de solicitud y evaluarse
con las expresiones regulares proporcionadas. Debe proporcionar al menos un elemento <Pattern>
que especifique un patrón de expresión regular con el que coincidir.
<FormParam name="a-form-param"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </FormParam>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
name |
Nombre del parámetro del formulario de solicitud del que se debe extraer información para evaluarla con las expresiones regulares proporcionadas. |
N/A | Obligatorio |
Elemento <Variable>
Especifica que la información debe extraerse de la variable indicada y evaluarse con las expresiones regulares proporcionadas.
<Variable name="request.content"> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </Variable>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
name |
Nombre de la variable de la que se debe extraer información para evaluarla con las expresiones regulares proporcionadas. |
N/A | Obligatorio |
Elemento <XMLPayload>
Especifica que la información debe extraerse de una carga útil XML y evaluarse 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>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Elemento <XMLPayload>/<Namespaces>
Especifica los espacios de nombres que se van a usar 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>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | Cadena |
Elemento <XMLPayload>/<Namespaces>/<Namespace>
Especifica cada espacio de nombres que se va a usar en la evaluación de XPath.<Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> </Namespaces>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | Cadena |
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 el XPath que se va a evaluar.<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
<XMLPayload>/<XPath>/<Expression> element
Especifica la expresión XPath definida para la variable. Solo se admiten expresiones XPath 1.0. Por ejemplo,<Expression>/company/employee[@age>=$request.header.age]</Expression>
extrae los detalles de los empleados cuya edad sea mayor o igual al 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>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | Cadena |
Elemento <XMLPayload>/<XPath>/<Type>
Especifica el tipo de datos de salida que quieras.
Normalmente, se usa "string" o "nodeset". Usa "string" si tienes la certeza de que tu consulta XPath dará como resultado un valor como máximo o si quieres comprobar un valor como máximo. Si la consulta xpath puede devolver varios valores, especifique "nodeset" para comprobar todos los valores.
Por ejemplo, considere la expresión XPath //*/@*
. Coincide con todos los atributos de todos los elementos. Si especifica "string" como Type
, Apigee convertirá el resultado de esta consulta en una sola cadena. Será el valor de uno de los atributos de uno de los elementos del documento XML, pero no se define qué atributo ni qué elemento. Apigee realizará una coincidencia de patrones con el valor de ese único atributo. Probablemente no sea lo que quieres.
Por el contrario, si especifica "nodeset" como Type
para esa expresión XPath, Apigee
realizará una coincidencia de patrones con cada uno de los valores de atributo de cada elemento del documento XML.
<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Valor predeterminado: | cadena |
Presencia: | Opcional |
Tipo: | Cadena |
Valores válidos: |
Una de estas palabras clave: |
Elemento <XMLPayload>/<XPath>/<Pattern>
Define el patrón de la expresión regular. Si una expresión regular del elemento
de su<Pattern>
incluye caracteres reservados de XML (", &, ', < o
.), debe codificarla en XML antes de incluirla.
<XPath> <Expression>/apigee:Greeting/apigee:User</Expression> <Type>string</Type> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </XPath>
Valor predeterminado: | N/A |
Presencia: | Obligatorio |
Tipo: | Cadena |
Elemento <JSONPayload>
Especifica que la información se debe extraer de una carga útil de JSON y evaluarse con las expresiones regulares proporcionadas.
<JSONPayload> <JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath> </JSONPayload>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
escapeSlashCharacter |
Se define 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>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | Cadena |
Elemento <JSONPayload>/<JSONPath>/<Pattern>
Define el patrón de la expresión regular. Si una expresión regular de su elemento
<Pattern>
incluye caracteres reservados de XML (", &, ', < o .),
debe codificarla en XML antes de incluirla.
<JSONPath> <Expression>$.store.book[*].author</Expression> <Pattern>REGEX PATTERN</Pattern> <Pattern>REGEX PATTERN</Pattern> </JSONPath>
Valor predeterminado: | N/A |
Presencia: | Obligatorio |
Tipo: | Cadena |
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 JSON
Política de protección contra amenazas XML