Expressions régulières pour débutants : Comment commencer à découvrir des données sensibles
May 29, 2019
Toute solution de découverte et de classification des données repose fortement sur les expressions régulières (parfois appelées RegExes, REs ou motifs RegEx) pour identifier les données sensibles. Mais que sont les RegExes et comment peuvent-elles être utilisées pour découvrir des données sensibles ? Découvrons-le.
Les expressions régulières sont un petit langage de programmation très spécialisé ; elles sont en gros des caractères jokers sous stéroïdes. En utilisant ce petit langage, vous spécifiez des règles qui définissent les chaînes de caractères que vous souhaitez correspondre. Par exemple, vous pouvez définir une RegEx qui correspondra aux adresses e-mail, aux informations personnellement identifiables, aux informations de santé protégées ou aux numéros de carte de crédit.
Composants Regex
Une expression régulière peut inclure des littéraux et des métacaractères.
Littéraux
Tout caractère unique, à l'exception de ceux réservés comme métacaractères, est déjà une expression régulière en soi. Par exemple, www est une correspondance pour www.Netwrix.com mais wwz ne l'est pas. Notez que les expressions régulières sont sensibles à la casse, donc www ne correspondra pas à WWW ni à wWw.
Métacaractères
Les caractères uniques suivants ne sont pas interprétés littéralement mais ont des significations particulières :
- . ^ $ * + ? { } [ ] | ( )
Le tableau suivant décrit comment chacun de ces métacaractères fonctionne.
Tapez | Méta-caractères | Description | Exemples |
|---|---|---|---|
|
Le point |
. |
Le point signifie n'importe quel caractère. |
net.rix correspondra à la fois à www.netwrix.com et à www.netfrix.com. |
|
Classe de personnage |
[] |
Correspondances pour tout ce qui est à l'intérieur des crochets. L'unique exception est le caractère ^. À l'intérieur d'une classe, au début, le ^ signifie exception de la recherche. Par exemple, [^n] correspondra à n'importe quel caractère sauf n ; ceci est appelé une classe de caractères négatifs. |
Vous pouvez lister les caractères individuellement ; par exemple, Netwrix correspondra à netw , netr et netx mais pas à netz. |
|
Ancres |
^ |
Utilisé pour faire correspondre des caractères au début d'une chaîne |
^https correspondra à https://netwrix.com mais pas à www.netwrix.com ni à http://netwrix.com |
|
$ |
Utilisé pour faire correspondre des caractères à la fin d'une chaîne |
com$ correspondra à www.netwrix.com ou telecom mais pas à computer. |
|
|
Itération / quantificateurs |
? |
Correspond à l'élément précédent zéro ou une fois (il correspondra toujours si le caractère n'a pas été trouvé). C'est idéal pour trouver des caractères optionnels. |
colou?r correspondra à la fois à color et à colour. |
|
|
* |
Correspond à l'élément précédent zéro ou plusieurs fois au lieu de zéro ou une fois. C'est idéal pour trouver des séries de caractères optionnelles. |
ne*t correspondra à nt (zéro caractère e), net (un e), neeet (trois caractères e), et ainsi de suite. |
|
+ |
Correspond à l'élément précédent une ou plusieurs fois. |
ne+t correspondra à net et à neeet mais pas à nt. |
|
|
| |
L'opérateur de choix correspond soit à l'expression avant soit à l'expression après l'opérateur. |
Netwrix correspondra à Netwrix et à Netwrix. |
|
|
{} |
{x} correspond si l'élément qui le précède est trouvé exactement x fois. |
n{3} correspondra à nnn, nnnn et nnnd (car ils contiennent tous n trois fois de suite), mais cela ne correspondra pas à nnw. |
|
|
Bloquer et capturer |
() |
Définit une sous-expression qui peut être rappelée plus tard en utilisant un raccourci : La première sous-expression entre parenthèses peut être rappelée par \1, la seconde peut être rappelée par \2 et ainsi de suite. |
Gr(a|e)y correspondra à Gray ou Grey. |
|
Séquence d'échappement |
\ |
Le métacaractère qui suit la barre oblique sera utilisé comme un littéral. |
www\.netwrix\.com correspondra à www.netwrix.com mais pas à www,netwrix,com. |
|
Des métacaractères spéciaux |
\s |
Correspond à tout caractère d'espacement (un espace, une tabulation, un saut de ligne ou un saut de page). |
Netwrix Auditor correspondra à Netwrix Auditor, et à Netwrix Auditor, mais pas à Netwrix Auditor ni à Netwrix Auditor. |
|
|
\S |
Correspond à tout caractère non-espaces. |
\Snetwrix correspondra à Xnetwrix et à 1netwrix. |
|
\w |
Correspond à tout caractère alphanumérique. |
\w\w\w correspondra à net, dfw et Netwrix. |
|
|
\W |
Correspond à tout caractère non alphanumérique. |
Netwrix correspondra à Netwrix et à Netwrix. |
|
|
|
\d |
Correspond à n'importe quel chiffre décimal. |
Netwrix\d\d correspondra à Netwrix80 et à Netwrix90. |
|
\D |
Correspond à tout caractère non numérique. |
Netwrix correspondra à Netwrix et à Netwrix. |
|
|
\a |
Correspond à n'importe quel caractère alphabétique unique, majuscule ou minuscule. |
Netwrix correspondra à Netwrix, netfrix et netarix. |
|
|
|
\b |
Définit une limite de mot. |
\brix correspondra à rix et rixon mais pas à Netwrix. |
|
|
\B |
Définit une limite qui n'est pas un mot |
\Brix correspondra à Netwrix et à trix mais pas à rixon. |
Combinaisons de métacaractères
Nous connaissons maintenant presque tous les métacaractères et sommes prêts à les combiner.
Exemple : Recherche de numéros de plaque d'immatriculation
Supposons que nous devons trouver un numéro de licence au format aaa-nnnn — les trois premiers caractères doivent être alphanumériques et les quatre derniers doivent être numériques. Le trait d'union peut être remplacé par n'importe quel caractère ou être complètement absent.
L'expression régulière pour cela sera :
- b[0-9A-Z]{3}([^ 0-9A-Z]|s)?[0-9]{4}b
Décortiquons cette RegEx :
- b nécessite une limite de mot, donc les chaînes correspondantes ne peuvent pas faire partie d'une chaîne plus grande.
- [0-9A-Z]{3} signifie que les trois premiers caractères doivent être alphanumériques.
- ([^ 0-9A-Z]|s)? signifie que la partie suivante de la chaîne doit être soit un délimiteur — un caractère non alphanumérique ou un espace — soit rien du tout.
- [0-9]{4} signifie que la partie suivante de la chaîne doit être de 4 chiffres.
- b indique une autre limite de mot.
Cette expression régulière correspondra aux numéros de licence suivants : NT5-6345, GH3 9452, XS83289
Cependant, cela ne correspondra pas à ces numéros de licence : ZNT49371, HG3-29347, nt4-9371
Exemple : Recherche de numéros de sécurité sociale
Un autre bon exemple est le numéro de sécurité sociale des États-Unis (SSN), qui prend toujours la forme nnn-nn-nnnn.
Le RegEx le plus simple est le suivant :
- [0-9]{3}-[0-9]{2}-[0-9]{4}
Cependant, cela générera des faux positifs, car tous les numéros ayant cette forme ne sont pas de véritables SSN. De plus, cela manquera certains SSN réels, y compris ceux qui sont écrits sans les traits d'union. Pour obtenir des résultats plus précis, nous devrions en construire un plus complexe. Nous savons que :
- Aucun groupe de chiffres ne peut être composé uniquement de zéros.
- Le premier bloc ne peut pas être 666 ou 900-999.
- Les numéros de sécurité sociale peuvent être écrits avec des caractères d'espacement au lieu de traits d'union, ou sans aucun délimiteur.
- Si le premier bloc commence par un 7, il doit être suivi d'un chiffre entre 0 et 6 puis n'importe quel troisième chiffre.
Par conséquent, l'expression régulière avancée ressemblera à ceci :
- b(?!000|666|9d{2})([0-8]d{2}|7([0-6]d))([-]?|s{1})(?!00)dd2(?!0000)d{4}b
Comme auparavant, b au début et à la fin spécifie une limite de mot. Examinons plus en détail chaque bloc de chiffres intermédiaire.
Le premier bloc
- (?!000|666|9d{2}) est une anticipation négative qui spécifie que le numéro ne doit pas commencer par 000, 666, ou 9 suivi de n'importe quels deux chiffres.
- ([0-8]d{2} indique que la chaîne doit commencer par un chiffre entre 0 et 8 et avoir deux chiffres supplémentaires (0-9) après.
- |7[0-6]d)) indique que cela commence par 7, le chiffre suivant doit être entre 0 et 6, suivi de n'importe quel chiffre.
- ([-]?|s{1}) indique qu'après les trois chiffres, il doit y avoir soit un trait d'union, un caractère d'espacement ou rien du tout pour marquer la fin du premier bloc.
Le deuxième bloc
- (?!00) est un autre look-ahead négatif qui spécifie qu'il ne doit pas y avoir 00 dans le second bloc.
- dd indique qu'il doit y avoir deux chiffres quelconques dans le deuxième bloc.
- 2 correspond au même texte que le deuxième groupe de capture, qui est ([-]?|s{1}), donc cela spécifie que le deuxième bloc peut se terminer par un trait d'union, un caractère d'espacement ou aucun caractère supplémentaire.
Le troisième bloc
- (?!0000) est un autre look-ahead négatif qui spécifie qu'il ne peut pas y avoir quatre zéros dans le troisième bloc.
- d{4} nécessite quatre chiffres dans le troisième bloc du numéro de sécurité sociale.
Exemples de RegExes populaires
Pour trouver | Utilisez cette RegEx | Exemple de correspondance |
|---|---|---|
|
Adresses e-mail |
^[\w\.=-]+@[\w\.-]+\.[\w]{2,3}$ |
T.Simpson@netwrix.com |
|
Numéros de sécurité sociale des États-Unis |
\b(?!000|666|9\d{2})([0-8]\d{2}|7([0-6]\d))([-]?|\s{1})(?!00)\d\d\2(?!0000)\d{4}\b |
513-84-7329 |
|
Adresses IPV4 |
^\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}$ |
192.168.1.1 |
|
Dates au format MM/JJ/AAAA |
^([1][12]|[0]?[1-9])[\/-]([3][01]|[12]\d|[0]?[1-9])[\/-](\d{4}|\d{2})$ |
05/05/2018 |
|
Numéros de MasterCard |
^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$ |
5258704108753590 |
|
Numéros de carte Visa |
\b([4]\d{3}[\s]\d{4}[\s]\d{4}[\s]\d{4}|[4]\d{3}[-]\d{4}[-]\d{4}[-] |
4563-7568-5698-4587 |
|
Numéros de carte American Express |
^3[47][0-9]{13}$ |
34583547858682157 |
|
Codes postaux des États-Unis |
^((\d{5}-\d{4})|(\d{5})|([A-Z]\d[A-Z]\s\d[A-Z]\d))$ |
97589 |
|
Chemins de fichiers |
\\[^\\]+$ |
\\fs1\partagé |
|
URLs |
(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+ |
www.netwrix.com |
Ressources web utiles pour Regex
- https://regexr.com et https://regex101.com vous aideront à vérifier vos RegExes en mettant en évidence la syntaxe et les infobulles.
- https://regexcrossword.com est un jeu de mots croisés où les indices sont définis à l'aide d'expressions régulières.
- https://www.regular-expressions.info est un excellent site avec des informations sur les expressions régulières. De plus, l'outil Notepad++ dispose d'une extension d'assistance RegEx qui vous sera très utile lorsque vous travaillez avec des expressions régulières.
Partager sur
En savoir plus
À propos de l'auteur
Jeff Melnick
Directeur de l'ingénierie des systèmes
Jeff est un ancien directeur de l'ingénierie des solutions mondiales chez Netwrix. Il est un blogueur, conférencier et présentateur de longue date chez Netwrix. Dans le blog Netwrix, Jeff partage des astuces et des conseils qui peuvent améliorer de manière significative votre expérience en administration système.
En savoir plus sur ce sujet
Les cinq prochaines minutes de conformité : construire une sécurité des données axée sur l'identité à travers l'APAC
Du bruit à l'action : transformer le risque des données en résultats mesurables
Lois sur la confidentialité des données par État : Différentes approches de la protection de la vie privée
Exemple d'analyse des risques : Comment évaluer les risques
Le Triangle CIA et son application dans le monde réel