TrustedSec | Regex Cheat Sheet (en anglais)

Les expressions régulières (regex) sont utilisées de diverses manières dans les industries techniques. Les développeurs les utilisent pour valider les entrées des utilisateurs, et les opérations de sécurité les utilisent pour écrire des détections de nouvelles attaques et des règles SIEM. L’une des utilisations les plus courantes des expressions régulières est la recherche dans de grandes quantités de données ou le nettoyage des résultats d’outils pour les rendre plus lisibles.

L’objectif de cet article est de fournir un guide de haut niveau pour le formatage de base des expressions rationnelles.

Il existe différentes formes de regex basées sur l’outil ou le langage de programmation utilisé, et chacune de ces implémentations peut avoir sa propre manière nuancée de gérer des caractéristiques spécifiques. Nous ne nous concentrerons pas sur ces situations. Nous nous concentrerons plutôt sur certains points communs généraux afin de nous familiariser avec la disposition et la compréhension de la manière dont les modèles sont disposés. Avec cette compréhension, passons à une vue d’ensemble de certains des motifs qui sont couramment utilisés dans les regex.

Classes de caractères

Il s’agit d’une liste de caractères qui peuvent apparaître dans le motif. Bien qu’il existe quelques gammes « standard » énumérées ci-dessous, il est également possible de créer une classe de caractères personnalisée lorsqu’un motif n’utilise qu’un petit ensemble de caractères spécifiques. Les classes de caractères sont définies par des crochets autour de la liste de caractères :

  • [a-z] – Toutes les lettres minuscules
  • [A-Z] – Toutes les lettres majuscules
  • [0-9] – Tous les chiffres
  • [aeiou] – Liste personnalisée de caractères individuels à comparer
  • [^09] – Correspondance négative – tout caractère ne figurant pas dans la liste

Occurrences

Souvent, un motif se répète, comme dans l’exemple d’une adresse IP. Ces opérateurs sont utilisés pour déterminer combien de fois le motif doit se répéter :

  • {1,3} – Définir une plage – le premier chiffre est la valeur minimale, et le second est la valeur maximale.
  • {4} – Nombre de fois que le motif doit être vérifié
  • + – Correspond à un (1) ou plusieurs des motifs spécifiés
  • * – Correspond à zéro (0) ou plus du motif spécifié
  • ? – Correspond à (0)zéro ou un (1) du motif spécifié

Caractères d’échappement

L’utilisation des caractères d’échappement est un élément des modèles de regex qui peut prêter à confusion. Dans chaque section, certains caractères sont utilisés de manière très spécifique, comme les crochets pour définir une liste. Il arrive que ces caractères spéciaux apparaissent dans votre modèle. Afin de faire correspondre ces caractères dans un modèle, une barre oblique inverse (\) doit être ajoutée en tant que préfixe :

  • [0-9\+] – Le motif peut contenir 0-9 ou un + littéral.

Métacaractères

Les métacaractères ont une signification particulière dans les expressions rationnelles. Ainsi, beaucoup d’entre eux commencent par un caractère d’échappement. Dans la plupart de ces cas, il s’agit d’une manière abrégée d’implémenter une classe de caractères pour rendre les motifs un peu plus concis :

  • . (point) – Correspond à n’importe quel caractère à l’exception de la nouvelle ligne
  • \d – Correspond à n’importe quel chiffre
  • \D – Correspond à tout caractère autre qu’un chiffre
  • \s – Correspond à n’importe quel caractère d’espacement
    • Il y a plusieurs caractères d’espacement [\n\r\t\f]
  • \S – Correspond à tout caractère autre qu’un espace blanc
  • ^ – Début de la ligne
  • $ – Fin de ligne

La mise en place

Les expressions rationnelles peuvent être utilisées pour rechercher de grandes quantités d’informations, comme grep sur la ligne de commande. Dans le premier exemple, je souhaite utiliser grep pour filtrer la sortie de ma commande afin de n’obtenir que les adresses IP contenues dans un document. Pour ce faire, nous devons d’abord comprendre le schéma d’une adresse IP :

  • Il y a quatre (4) ensembles de nombres, appelés octets, qui peuvent aller de 0 à 255.
  • Chaque octet est séparé par un point.

Il existe de nombreuses façons de représenter ce motif dans les expressions rationnelles. Voici une (1) seule façon possible de représenter ce motif :

[1-2]?[0-9]{1,2}\.[1-2]?[0-9]{1,2}\.[1-2]?[0-9]{1,2}\.[1-2]?[0-9]{1,2}

  • [1-2]?Le premier entier de l’octet sera un 1, 2, ou peut ne pas être composé de trois (3) chiffres.
  • [0-9]{1,2} – Regarder pour un chiffre de 0 à 9 ; il peut y avoir un (1) ou deux (2) chiffres
  • \. – Te délai entre les octets

Notez qu’un caractère d’échappement a été utilisé pour le point. Sinon, il serait interprété comme le métacaractère et pourrait donner de mauvais résultats. La recherche de chiffres est répétée trois (3) fois de plus, pour chacun des octets restants. Dans la figure 1, vous verrez une commande pour lire un fichier à partir de la ligne de commande Linux. La sortie de cette commande sera transmise à grep pour filtrer la sortie jusqu’à ce que seules les informations qui correspondent à l’expression rationnelle (regex) soient présentes..

Figure 1 – Recherche par expressions rationnelles dans grep

En regardant la sortie de la commande, on constate qu’il y a plus d’informations que prévu. C’est l’occasion idéale de souligner à quel point une expression rationnelle doit être spécifique. Dans ce cas, le motif correspond également à un numéro de version dans la sortie. En rendant l’expression rationnelle plus spécifique à une adresse IPv4, il est possible d’éliminer l’excès d’informations. Toutefois, si l’on est trop précis avec un motif, on risque de filtrer plus d’informations que prévu et de passer à côté de certains résultats.

Les correspondances négatives sont utilisées pour rechercher des valeurs qui ne correspondent pas à un modèle donné. Dans la capture d’écran ci-dessous, j’ai un fichier JSON contenant une liste de dinosaures et d’attributs. Le fichier étant au format JSON, il contient plusieurs caractères spéciaux et des espaces non désirés. L’utilisation d’une recherche et d’un remplacement par regex dans Visual Studio Code peut aider à nettoyer ces informations.

Figure 2 – Données JSON brutes
  • [^\w:"] – La recherche porte sur tout caractère autre qu’un mot et exclut les deux points et les guillemets doubles de la recherche puisqu’ils font partie de la paire clé-valeur.
  • {3,} – Correspondance seulement si ces caractères apparaissent trois (3) fois ou plus ; ceci est inclus parce que certaines des valeurs que nous voulons conserver incluent des espaces et des virgules.
  • | Faire correspondre le motif avant ou après ce caractère
  • [^\w"]$ – Correspondance tout caractère autre qu’un mot, à l’exception des guillemets, à la fin d’une ligne

Après avoir effectué la recherche et le remplacement dans Visual Studio Code, une grande partie du formatage JSON a été supprimée. Cela semble être une solution suffisante pour ce cas d’utilisation.

Figure 3 – Correspondance et remplacement du contenu d’un fichier

Enfin, Regex101 est une excellente ressource pour tester les expressions rationnelles par rapport à des exemples d’informations. Cette ressource permet également aux utilisateurs de choisir le type de regex, ou le langage de programmation, avec lequel ils travaillent, afin de gérer certains tokens spécifiques au langage..

Un autre outil très utile pour renforcer la connaissance des classes de regex est https://regexcrossword.com/. Le site utilise des expressions rationnelles dans une grille de mots croisés pour que les utilisateurs trouvent la solution.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *