Política RegularExpressionProtection

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

Consulta la documentación de Apigee Edge.

ícono de política

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

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:


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


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

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

De forma opcional, usa el elemento <DisplayName> para etiquetar la política en el editor de proxy de la IU de administración con un nombre de lenguaje natural diferente.

N/A Obligatorio
continueOnError

Configúralo como false para mostrar un error cuando una política falla. Este es el comportamiento previsto para la mayoría de las políticas.

Configúralo como true para continuar con la ejecución del flujo incluso después de que una política falle. También consulta lo siguiente:

falso Opcional
enabled

Configúralo como true para aplicar la política.

Configúralo como false para desactivar la política. La política no se aplicará incluso si permanece adjunta a un flujo.

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

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

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 para escapar cualquier carácter de barra diagonal (/) de las expresiones regulares en <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>
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}
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 de JSON

Política de protección contra amenazas de XML