Séquences d'échappement
Presque chaque bug d'échappement est une erreur de contexte plutôt qu'une erreur de syntaxe. Le caractère est connu — un guillemet, une barre oblique inverse, une esperluette — et ce qui n'est pas clair, c'est laquelle des six règles conflictuelles s'applique où la chaîne est sur le point de descendre.
Donc cette table est organisée par contexte, pas par caractère. Le même guillemet est doublé dans une cellule CSV, échappé par barre oblique inverse en JSON, transformé en " en HTML et laissé complètement seul à l'intérieur de guillemets simples dans un shell. Quatre lignes, quatre règles, un caractère.
La règle qui compte le plus est celle que les gens recherchent en dernier : échapper à la limite que la valeur traverse, et l'échapper une fois. Un texte échappé deux fois — un & dans la source de la page, un \\n dans le fichier de sortie — est la signature d'une valeur qui a traversé deux encodeurs qui chacun supposaient qu'ils étaient en premier.
Chaînes JSON
10JSON permet exactement ces échappements. Une nouvelle ligne ou une tabulation littérale à l'intérieur d'une chaîne est invalide.
| Échappement | Signifie | Quand vous en avez besoin | En contexte |
|---|---|---|---|
| \" | " | Un guillemet double à l'intérieur d'une chaîne | "say \"hi\"" |
| \\ | \ | Une barre oblique inverse littéraleLa raison pour laquelle les chemins Windows cassent JSON. | "C:\\dir" |
| \/ | / | Une barre oblique — optionnelleLégale mais inutile ; une habitude d'incorporer JSON dans les balises <script>. | "a\/b" |
| \n | U+000A | Un flux de ligne | "line\nline" |
| \r | U+000D | Un retour à la chariot | |
| \t | U+0009 | Une tabulation | |
| \b | U+0008 | Un retour arrière | |
| \f | U+000C | Un saut de formulaire | |
| \u00e9 | é | Tout caractère par son point de code à quatre chiffres | "caf\u00e9" |
| \ud83d\ude00 | 😀 | Un caractère au-dessus de U+FFFF, sous forme de paire de remplacementJSON n'a pas de forme \u{…}, donc les caractères astraux prennent deux échappements. |
Chaînes JavaScript
10Un sur-ensemble de JSON, plus les échappements littérals de modèle.
| Échappement | Signifie | Quand vous en avez besoin | En contexte |
|---|---|---|---|
| \' | ' | Un guillemet simple à l'intérieur d'une chaîne entre guillemets simples | |
| \" | " | Un guillemet double à l'intérieur d'une chaîne entre guillemets doubles | |
| \` | ` | Un backtick à l'intérieur d'un littéral de modèle | |
| \${ | ${ | Un littéral ${ à l'intérieur d'un littéral de modèleSans la barre oblique inverse, il démarre une interpolation. | |
| \n | U+000A | Un flux de ligne | |
| \xe9 | é | Un caractère par deux chiffres hexadécimaux, jusqu'à U+00FF | |
| \u00e9 | é | Un caractère par quatre chiffres hexadécimaux | |
| \u{1f600} | 😀 | N'importe quel point de code, quelle que soit sa longueurN'a pas besoin d'une paire de remplacement, contrairement à la forme à quatre chiffres. | |
| \0 | U+0000 | Un caractère nul | |
| \u2028 | U+2028 | Séparateur de ligneValide dans une chaîne JS mais pas en JSON — une cassure JSONP classique. |
Texte et attributs HTML
8Seuls & et < doivent strictement être échappés dans le texte ; les guillemets importent à l'intérieur des attributs.
| Échappement | Signifie | Quand vous en avez besoin | En contexte |
|---|---|---|---|
| & | & | Une esperluetteÉchappez celui-ci d'abord, ou chaque autre échappement double. | |
| < | < | Un signe moins-que, pour qu'il ne commence pas une balise | |
| > | > | Un signe supérieur à | |
| " | " | Un guillemet double à l'intérieur d'un attribut | |
| ' | ' | Un guillemet simple à l'intérieur d'un attribut' fonctionne aussi en HTML5, mais la forme numérique est sûre partout. | |
| | U+00A0 | Un espace insécable | |
| é | é | N'importe quel caractère par point de code décimal | |
| é | é | N'importe quel caractère par point de code hexadécimal |
URL (codage en pourcentage)
9Les caractères qui ont besoin d'échappement dépendent de la partie de l'URL dans laquelle ils se trouvent.
| Échappement | Signifie | Quand vous en avez besoin | En contexte |
|---|---|---|---|
| %20 | Un espace, valide partout dans une URL | ||
| + | Un espace, mais seulement dans une chaîne de requête codée en formulaireDans un segment de chemin c'est un signe plus littéral. | ||
| %25 | % | Un signe pour cent littéralManquez cela et la valeur se décode deux fois. | |
| %2F | / | Une barre oblique à l'intérieur d'un segment de chemin unique | |
| %3F | ? | Un point d'interrogation à l'intérieur d'une valeur | |
| %26 | & | Une esperluette à l'intérieur d'une valeur de paramètre | |
| %3D | = | Un signe égal à l'intérieur d'une valeur de paramètre | |
| %23 | # | Un hachage, pour qu'il ne commence pas le fragment | |
| %C3%A9 | é | Un caractère non-ASCII, sous forme d'octets UTF-8Un caractère peut devenir deux, trois ou quatre groupes de pour cent. |
Champs CSV
5RFC 4180 : enveloppez le champ, puis doublez tous les guillemets intérieurs. Les barres obliques inverses ne signifient rien.
| Échappement | Signifie | Quand vous en avez besoin | En contexte |
|---|---|---|---|
| "" | " | Un guillemet à l'intérieur d'un champ entre guillemets — doublez-le | "say ""hi""" |
| "a,b" | , | Un champ contenant le délimiteur — enveloppez le champ | |
| "a b" | U+000A | Un champ contenant un saut de ligne — enveloppez le champ | |
| " a" | Préservez les espaces de début ou de finNon cités, de nombreux analyseurs les coupent. | ||
| '=SUM(A1) | = | Arrêtez un tableur exécutant la cellule en tant que formuleS'applique aux valeurs commençant par =, +, - ou @. C'est une injection de formule. |
Littéraux SQL et identifiants
6Lisez ceux-ci ; ne les écrivez pas. Utilisez des requêtes paramétrées à la place.
| Échappement | Signifie | Quand vous en avez besoin | En contexte |
|---|---|---|---|
| '' | ' | Un guillemet à l'intérieur d'une chaîne littérale — doublez-le | 'O''Brien' |
| "order" | order | Un mot réservé utilisé comme nom de colonneLes guillemets doubles sont la norme ; SQL Server utilise [brackets]. | |
| `order` | order | La même chose dans MySQL et MariaDB | |
| \% | % | Un % littéral à l'intérieur d'un motif LIKE | |
| \_ | _ | Un _ littéral à l'intérieur d'un motif LIKE | |
| $tag$ … $tag$ | ' | Guillemets à dollars PostgreSQL — pas d'échappement du tout à l'intérieurUtile pour les corps de code, où doubler chaque guillemet est illisible. |
Arguments Shell
6Les guillemets simples sont littéraux, les guillemets doubles développent toujours les variables.
| Échappement | Signifie | Quand vous en avez besoin | En contexte |
|---|---|---|---|
| '…' | $ ` \ | Tout à l'intérieur est littéralLe devis le plus sûr qu'il y ait — mais il ne peut pas contenir un guillemet simple. | |
| "…" | * ? space | Les globs et les espaces sont sûrs, les variables se développent toujoursAlways quote variables: "$var", never bare $var. | |
| \ | Un espace dans un nom de fichier non cité | ||
| \$ | $ | Un signe dollar littéral à l'intérieur de guillemets doubles | |
| \` | ` | Un backtick littéral, pas une substitution de commande | |
| '\'' | ' | Un guillemet simple à l'intérieur de guillemets simplesFermer, s'échapper, rouvrir — il n'y a pas moyen de le nicher directement. |