Política RegularExpressionProtection

Esta página se aplica a Apigee y Apigee Hybrid.

Consulta la documentación de Apigee Edge.

Icono de política

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 &lt; y > por &gt;.

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:

&lt;!--#(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:

&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*/\s*script\s*&gt;

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 encabezado Content-Type de la solicitud debe ser un tipo de contenido XML, como application/xml o text/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 encabezado Content-Type de la solicitud debe ser un tipo de contenido JSON, como application/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 name puede contener letras, números, espacios, guiones, guiones bajos y puntos. Este valor no puede superar los 255 caracteres.

Opcionalmente, usa el elemento <DisplayName> para etiquetar la política en el editor de proxy de la interfaz de gestión con un nombre diferente en lenguaje natural.

N/A Obligatorio
continueOnError

Asigna el valor false para devolver un error cuando falle una política. Este es el comportamiento esperado de la mayoría de las políticas.

Asigna el valor true para que la ejecución del flujo continúe incluso después de que falle una política. Consulta también:

falso Opcional
enabled

Asigna el valor true para aplicar la política.

Selecciona false para desactivar la política. La política no se aplicará aunque siga adjunta a un flujo.

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 name de la política.

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: string, boolean, int, long, float, double y nodeset.

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 para incluir caracteres de escape en las barras inclinadas (/) de las expresiones regulares de <JSONPath>/<Pattern>.

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}
DuplicatePrefix RegularExpressionProtection {0}: Duplicate prefix {1}
EmptyJSONPathExpression RegularExpressionProtection {0}: Empty JSONPath expression
EmptyXPathExpression RegularExpressionProtection {0}: Empty XPath expression
InvalidRegularExpression RegularExpressionProtection {0}: Invalid Regular Expression {1}, Context {2}
JSONPathCompilationFailed RegularExpressionProtection {0}: Failed to compile jsonpath {1}. Context {2}
NONEmptyPrefixMappedToEmptyURI RegularExpressionProtection {0}: Non-empty prefix {1} cannot be mapped to empty uri
NoPatternsToEnforce RegularExpressionProtection {0}: No patterns to enforce in {1}
NothingToEnforce RegularExpressionProtection {0}: at least one of URIPath, QueryParam, Header, FormParam, XMLPayload, JSONPayload is mandatory
XPathCompilationFailed RegularExpressionProtection {0}: Failed to compile xpath {1}. Context {2}

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