Política RegularExpressionProtection

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>&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&gt;
          </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 &lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&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>

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:

&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;
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 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.

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 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 string, boolean, int, long, float, double, and 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 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}
DuplicatePrefix RegularExpressionProtection {0}: prefijo duplicado {1}
EmptyJSONPathExpression RegularExpressionProtection {0}: Expresión JSONPath vacía
EmptyXPathExpression RegularExpressionProtection {0}: expresión XPath vacía
InvalidRegularExpression RegularExpressionProtection {0}: expresión regular no válida {1}, contexto {2}
JSONPathCompilationFailed RegularExpressionProtection{0}: No se pudo compilar jsonpath {1}. Contexto {2}
NONEmptyPrefixMappedToEmptyURI RegularExpressionProtection {0}: el prefijo no vacío {1} no se puede asignar al URI vacío
NoPatternsToEnforce RegularExpressionProtection {0}: sin patrones para aplicar en {1}
NothingToEnforce RegularExpressionProtection {0}: al menos uno de URIPath, QueryParam, Header, FormParam, XMLPayload y JSONPayload es obligatorio
XPathCompilationFailed RegularExpressionProtection {0}: no se pudo compilar xpath {1}. Contexto {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