Le langage de règles ESA fournit des fonctions de transformation pour manipuler et valider les valeurs extraites des requêtes HTTP.
Fonctions de transformation prises en charge
concat
Concatène des chaînes de caractères.
Format :
concat(String | Integer | Bytes | Array elements):String.Logique : Assemble une liste de valeurs séparées par des virgules en une seule chaîne.
-
Exemples :
concat("String1"," ","String",2)retourne"String1 String2".concat("/archive",http.request.uri.path)ajoute le segment de chemin"/archive"au début du chemin URI.concat("userid=123&",http.request.uri.query)préfixe la paire clé-valeur"userid=123"à la chaîne de requête URI.concat("https://www.example.com",http.request.uri.path)combine un nouveau nom d'hôte avec le chemin de la requête d'origine pour générer une nouvelle URL.
ends_with
Vérifie si une chaîne se termine par une sous-chaîne spécifiée.
Format :
ends_with(source String,substring String):Boolean.-
Logique :
Retourne
truesisource Stringse termine parsubstring String. Sinon, la fonction retournefalse.source Stringdoit être un champ. Les chaînes littérales ne sont pas autorisées. Par exemple, n'écrivez pasends_with("foo.html",".html").
Exemple : Si
http.request.uri.pathvaut"/welcome.html", alorsends_with(http.request.uri.path,".html")retournetrue.
exists
Vérifie la présence d'informations spécifiques dans la requête.
Format :
exists(String):Boolean.Logique : Certains champs de requête sont facultatifs (en-têtes, Referer, User-Agent, cookies). Cette fonction vérifie si les informations facultatives spécifiées sont présentes dans la requête client. Elle retourne
truesi l'information existe, oufalsedans le cas contraire.Exemple : Si la requête ne contient pas d'en-tête nommé
example, alorsexists(http.request.headers["example"])retournefalse.
len
Retourne la longueur d'une chaîne.
Format :
len(String):Integer.Logique : Retourne le nombre de caractères de la valeur de chaîne d'un champ.
-
Exemples :
Si
http.hostvaut"example.com", alorslen(http.host)retourne11.len(http.request.uri) eq 11retournetrue.len(http.request.uri) gt 11retournefalse.len(http.request.uri) lt 11retournefalse.
lower
Convertit une chaîne en minuscules.
Format :
lower(String):StringLogique : Convertit en minuscules la valeur de chaîne d'un champ. Seuls les octets ASCII majuscules sont convertis ; les autres octets restent inchangés.
Exemple : Si
http.hostvaut"WWW.example.com", alorslower(http.host)=="www.example.com"retournetrue.
percent
Filtre les requêtes selon la valeur d'un champ spécifié et un seuil de pourcentage.
Format :
percent(String | IP address, Integer):Boolean.Logique : Calcule le hachage MD5 de la valeur du champ spécifié dans la requête client, puis applique un modulo pour mapper le résultat à un entier compris entre 1 et 100. Si la valeur mappée (A) est inférieure ou égale à l'entier spécifié (B), la fonction retourne
true. Sinon, elle retournefalse.-
Remarques :
Si la valeur du champ est vide (par exemple, si la requête ne contient pas l'en-tête spécifié), la règle ne s'applique pas et la fonction retourne
false.Le second paramètre doit être un entier compris entre 1 et 100.
-
Champs pris en charge :
En-tête :
http.request.headers["example"]Adresse IP client :
ip.srcValeur de cookie :
http.request.cookies["example"]Paramètre de requête URI :
http.request.uri.args["example"]Horodatage de la requête :
http.request.timestamp.sec
-
Exemples :
percent(http.request.headers["example"], 80)percent(ip.src, 80)percent(http.request.cookies["example"], 80)percent(http.request.uri.args["example"], 80)percent(http.request.timestamp.sec, 80)
regex_replace
Remplace les sous-chaînes correspondant à un modèle d'expression régulière.
Format :
regex_replace(source String,regular_expression String,replacement String):String.-
Logique :
Remplace la première sous-chaîne correspondant à l'expression régulière par la chaîne de remplacement.
Par défaut, la correspondance respecte la casse.
Seule la première occurrence est remplacée, même si la chaîne source contient plusieurs correspondances.
Échappez un caractère
$dans la chaîne de remplacement en le faisant précéder d'un autre caractère$.La chaîne de remplacement peut contenir des références aux groupes de capture de l'expression régulière au format
${<NUMBER>}, où<NUMBER>correspond au numéro du groupe de capture. Jusqu'à huit références de ce type sont prises en charge, telles que${1}et${2}.
-
Exemples :
-
Correspondance et remplacement de caractères statiques :
Correspondance de chaîne réussie :
regex_replace("/animal/cat","/cat$","/dog")=="/animal/dog".-
En l'absence de correspondance, la chaîne source reste inchangée :
Chaînes différentes :
regex_replace("/x","^/y$","/z")=="/x".Chaînes sensibles à la casse :
regex_replace("/cat","^/CAT$","/dog")=="/cat".
Lorsqu'il existe plusieurs correspondances, seule la première est remplacée :
regex_replace("/a/a","/a","/b")=="/b/a".Échappement du caractère
$dans la chaîne de remplacement :regex_replace("/b","^/b$","/b$$")=="/b$".Utilisation de groupes de capture dans la chaîne de remplacement :
regex_replace("/foo/a/path","^/foo/([^/]*)/(.*)$","/bar/${2}/${1}")=="/bar/path/a".
-
Correspondance et remplacement de champs dynamiques :
La chaîne source utilise un champ dynamique pour récupérer les informations de chemin de la requête client. Cet exemple remplace
/cat/dans le chemin par/dog/:regex_replace(http.request.uri.path,"/cat/(.*)$","/dog/${1}").Exemple de remplacement complexe : Remplace chaque caractère
+du chemin de requête d'origine par la chaîne%2B:regex_replace(http.request.uri.path, "^([^+]*)\\+([^+]*)\\+(.*)$", "${1}%2B${2}%2B${3}").
-
starts_with
Vérifie si une chaîne commence par une sous-chaîne spécifiée.
Format :
starts_with(source String,substring String):Boolean-
Logique :
Retourne
truesisource Stringcommence parsubstring String. Sinon, elle retournefalse.source Stringdoit être un champ. Les chaînes littérales ne sont pas autorisées. Par exemple, n'écrivez passtarts_with("foo.html",".html").
Exemple : Si
http.request.uri.pathvaut"/welcome.html", alorsstarts_with(http.request.uri.path,".html")retournetrue.
to_string
Convertit une valeur en sa représentation sous forme de chaîne.
Format :
to_string(Integer | Boolean | IP address):String.Logique : Retourne la représentation sous forme de chaîne d'une valeur
Integer,Booleanou d'une adresseIP.-
Exemples :
Si le résultat de
ip.src.asnumest15169, alorsto_string(ip.src.asnum)retourne"15169".Si le résultat de
sslesttrue, alorsto_string(ssl)retourne"true".Si le résultat de
ip.srcest192.168.0.1, alorsto_string(ip.src)retourne"192.168.0.1".
upper
Convertit une chaîne en majuscules.
Format :
upper(String):String.Logique : Convertit en majuscules la valeur de chaîne d'un champ. Seuls les octets ASCII minuscules sont convertis ; les autres octets restent inchangés.
Exemple : Si
http.hostvaut"www.example.com", alorsupper(http.host)retourne"WWW.EXAMPLE.COM".
wildcard_replace
Remplace les sous-chaînes correspondant à un modèle avec caractères génériques.
Format :
wildcard_replace(source Bytes,wildcard_pattern Bytes,replacement Bytes,flags Bytes optional):String-
Logique :
Compare la chaîne source à un modèle contenant zéro ou plusieurs caractères génériques
*, remplace la partie correspondante par la chaîne de remplacement et retourne le résultat. La chaîne de remplacement peut contenir des références aux groupes de capture génériques, telles que${1}et${2}. Jusqu'à huit références de remplacement sont prises en charge.En l'absence de correspondance, la fonction retourne la chaîne source d'origine.
Le paramètre
sourcedoit être un champ, et non une chaîne littérale. L'intégralité de la valeursourcedoit correspondre au paramètrewildcard_pattern; les correspondances partielles ne sont pas prises en charge.Pour saisir un caractère
*littéral dans le paramètrewildcard_pattern, échappez-le avec\*. Échappez également le caractère\avec\\. Deux caractères*non échappés consécutifs, tels que**, sont invalides et inutilisables. Pour échapper des caractères, utilisez la syntaxe de chaîne brute pour le paramètrewildcard_pattern.Pour saisir un caractère
$littéral dans le paramètrereplacement, échappez-le avec$$.Pour effectuer une correspondance générique sensible à la casse, définissez le paramètre
flagssurs.Cette fonction utilise une correspondance paresseuse : chaque
*correspond à la chaîne la plus courte possible.
-
Exemples :
Si l'URI complète est
https://apps.example.com/calendar/admin?expand=true, l'expressionwildcard_replace(http.request.full_uri,"https://*.example.com/*/*","https://example.com/${1}/${2}/${3}")retournehttps://example.com/apps/calendar/admin?expand=true.Si l'URI complète est
https://example.com/applications/app1, l'expressionwildcard_replace(http.request.full_uri,"/applications/*","/apps/${1}")retournehttps://example.com/applications/app1inchangée, car le modèle doit correspondre à l'URI complète. Utilisezhttp.request.uri.pathpour une correspondance limitée au chemin.Si le chemin URI est
/calendar, l'expressionwildcard_replace(http.request.uri.path,"/*","/apps/${1}")retourne/apps/calendar.Si le chemin URI est
/Apps/calendar, l'expressionwildcard_replace(http.request.uri.path,"/apps/*","/${1}")retourne/calendar. La correspondance est insensible à la casse par défaut.Si le chemin URI est
/Apps/calendar, l'expressionwildcard_replace(http.request.uri.path,"/apps/*","/${1}","s")retourne/Apps/calendar. Le paramètreflagsest défini surspour activer la correspondance sensible à la casse. Comme le modèle ne correspond pas au chemin URI d'origine, le résultat reste inchangé.Si le chemin URI est
/apps/calendar/login, l'expressionwildcard_replace(http.request.uri.path,"/apps/*/login","/${1}/login")retourne/calendar/login.