Règle JSONThreatProtection

Règle extensible

Cette page s'applique à Apigee et à Apigee hybrid.

Consultez la documentation d' Apigee Edge.

Les API qui acceptent les charges utiles JSON sont vulnérables aux attaques malveillantes conçues pour surcharger l'analyseur JSON. Ces attaques peuvent inclure des charges utiles avec un nombre excessif d'éléments de tableau, des structures profondément imbriquées ou des chaînes incroyablement longues, ce qui peut entraîner le plantage du service ou consommer une quantité excessive de mémoire.

La règle JSONThreatProtection minimise ce risque en filtrant les requêtes entrantes pour détecter les charges utiles qui enfreignent les limites définies sur les structures telles que les tableaux et les chaînes. Elle protège ainsi efficacement vos services de backend contre ces attaques par déni de service ou d'analyseur.

Cette règle est une règle extensible et son utilisation peut avoir des conséquences sur le coût ou l'utilisation, en fonction de votre licence Apigee. Pour en savoir plus sur les types de règles et les implications en termes d'utilisation, consultez la section Types de règles.

Documentation de référence des éléments

La documentation de référence des éléments décrit les éléments et les attributs de la règle de protection contre les menaces JSON.

<JSONThreatProtection async="false" continueOnError="false" enabled="true" name="JSON-Threat-Protection-1">
   <DisplayName>JSONThreatProtection 1</DisplayName>
   <ArrayElementCount>20</ArrayElementCount>
   <ContainerDepth>10</ContainerDepth>
   <ObjectEntryCount>15</ObjectEntryCount>
   <ObjectEntryNameLength>50</ObjectEntryNameLength>
   <Source>request</Source>
   <StringValueLength>500</StringValueLength>
</JSONThreatProtection>

Attributs <JSONThreatProtection>

<JSONThreatProtection async="false" continueOnError="false" enabled="true" name="JSON-Threat-Protection-1">

The following table describes attributes that are common to all policy parent elements:

Attribute Description Default Presence
name

The internal name of the policy. The value of the name attribute can contain letters, numbers, spaces, hyphens, underscores, and periods. This value cannot exceed 255 characters.

Optionally, use the <DisplayName> element to label the policy in the management UI proxy editor with a different, natural-language name.

N/A Required
continueOnError

Set to false to return an error when a policy fails. This is expected behavior for most policies.

Set to true to have flow execution continue even after a policy fails. See also:

false Optional
enabled

Set to true to enforce the policy.

Set to false to turn off the policy. The policy will not be enforced even if it remains attached to a flow.

true Optional
async

This attribute is deprecated.

false Deprecated

<DisplayName> element

Use in addition to the name attribute to label the policy in the management UI proxy editor with a different, natural-language name.

<DisplayName>Policy Display Name</DisplayName>
Default

N/A

If you omit this element, the value of the policy's name attribute is used.

Presence Optional
Type String

Élément <ArrayElementCount>

Indique le nombre maximal d'éléments autorisés dans un tableau.

<ArrayElementCount>20</ArrayElementCount>
Valeur par défaut : Si vous ne spécifiez pas cet élément, ou si vous spécifiez un entier négatif, le système n'applique pas de limite.
Présence : Facultatif
Type : Entier

Élément <ContainerDepth>

Spécifie la profondeur maximale autorisée du conteneur (les conteneurs étant des objets ou des tableaux). Par exemple, un tableau contenant un objet contenant lui-même un objet donnerait une profondeur de conteneur de 3.

<ContainerDepth>10</ContainerDepth>
Valeur par défaut : Si vous ne spécifiez pas cet élément ou si vous spécifiez un entier négatif, le système n'applique aucune limite.
Présence : Facultatif
Type : Entier

Élément <ObjectEntryCount>

Spécifie le nombre maximal d'entrées autorisées dans un objet.

<ObjectEntryCount>15</ObjectEntryCount>
Valeur par défaut : Si vous ne spécifiez pas cet élément ou si vous spécifiez un entier négatif, le système n'applique aucune limite.
Présence : Facultatif
Type : Entier

Élément <ObjectEntryNameLength>

Spécifie la longueur maximale de chaîne autorisée pour un nom de propriété dans un objet.

<ObjectEntryNameLength>50</ObjectEntryNameLength>
Valeur par défaut : Si vous ne spécifiez pas cet élément, ou si vous spécifiez un entier négatif, le système n'applique pas de limite.
Présence : Facultatif
Type : Entier

Élément <Source>

Message à analyser pour rechercher des attaques de charge utile JSON. Ce paramètre est habituellement défini sur request, car vous devez généralement valider les requêtes entrantes provenant des applications clientes. Lorsque ce paramètre est défini sur message, cet élément évalue automatiquement le message de requête lorsqu'il est associé au flux de la requête et le message de réponse lorsqu'il est associé au flux de réponse.

<Source>request</Source>
Valeur par défaut : requête
Présence : Facultatif
Type :

Chaîne.

Valeurs valides : requête, réponse ou message.

Élément <StringValueLength>

Spécifie la longueur maximale autorisée pour une valeur de chaîne.

<StringValueLength>500</StringValueLength>
Valeur par défaut : Si vous ne spécifiez pas cet élément, ou si vous spécifiez un entier négatif, le système n'applique pas de limite.
Présence : Facultatif
Type : Entier

Informations de référence sur les erreurs

Cette section décrit les codes d'erreur et les messages d'erreur renvoyés et les variables d'erreur définies par Apigee lorsque cette règle déclenche une erreur. Ces informations sont importantes si vous développez des règles de défaillance afin de gérer les pannes. Pour en savoir plus, consultez les pages Ce que vous devez savoir sur les erreurs liées aux règles et Gérer les pannes.

Erreurs d'exécution

Ces erreurs peuvent se produire lors de l'exécution de la règle.

Code d'erreur État HTTP Cause Corriger
steps.jsonthreatprotection.ExecutionFailed 500 La règle JSONThreatProtection peut générer de nombreux types d'erreurs ExecutionFailed. La plupart de ces erreurs se produisent lorsqu'un seuil spécifique défini dans la règle est dépassé. Ces types d'erreurs incluent les éléments suivants : longueur de noms d'entrée d'objet, nombre d'entrées d'objet, nombre d'éléments de tableau, profondeur de conteneur, longueur de valeur de chaîne. Cette erreur se produit également lorsque la charge utile contient un objet JSON non valide.
steps.jsonthreatprotection.SourceUnavailable 500 Cette erreur se produit si la variable message spécifiée dans l'élément <Source> :
  • est hors de portée (non disponible dans le flux spécifique où la règle est exécutée)
  • n'est pas une des valeurs valides request, response ou message.
steps.jsonthreatprotection.NonMessageVariable 500 Cette erreur se produit si l'élément <Source> est défini sur une variable qui n'est pas de type message.

Erreurs de déploiement

Aucune.

Variables de panne

Ces variables sont définies lorsque cette règle déclenche une erreur. Pour en savoir plus, consultez la section Ce que vous devez savoir sur les erreurs liées aux règles.

Variables Lieu Exemple
fault.name="fault_name" fault_name est le nom de l'erreur, tel qu'indiqué dans le tableau Erreurs d'exécution ci-dessus. Le nom d'erreur est la dernière partie du code d'erreur. fault.name Matches "SourceUnavailable"
jsonattack.policy_name.failed policy_name est le nom spécifié par l'utilisateur de la règle qui a provoqué l'erreur. jsonattack.JTP-SecureRequest.failed = true

Exemple de réponse d'erreur

{
  "fault": {
    "faultstring": "JSONThreatProtection[JPT-SecureRequest]: Execution failed. reason: JSONThreatProtection[JTP-SecureRequest]: Exceeded object entry name length at line 2",
    "detail": {
      "errorcode": "steps.jsonthreatprotection.ExecutionFailed"
    }
  }
}

Exemple de règle de défaillance

<FaultRule name="JSONThreatProtection Policy Faults">
    <Step>
        <Name>AM-CustomErrorResponse</Name>
        <Condition>(fault.name Matches "ExecutionFailed") </Condition>
    </Step>
    <Condition>(jsonattack.JPT-SecureRequest.failed = true) </Condition>
</FaultRule>

Schémas

Remarques sur l'utilisation

Tout comme les services basés sur XML, les API compatibles avec la notation d'objet JavaScript (JSON) sont vulnérables aux attaques au niveau du contenu. Les attaques JSON simples tentent d'utiliser des structures qui surchargent les analyseurs JSON pour faire planter un service et provoquer des attaques par déni de service au niveau de l'application. Tous les paramètres sont facultatifs et doivent être réglés de façon à optimiser les exigences de votre service contre les failles potentielles.

Articles associés

Règle JSONtoXML

Règle XMLThreatProtection

Règle de protection contre les expressions régulières