Escape-Sequenzen
Fast jeder Escaping-Fehler ist ein Kontextfehler statt eines Syntaxfehlers. Das Zeichen ist bekannt – ein Anführungszeichen, ein Backslash, ein Ampersand – und unklar ist, welche der sechs konfliktierenden Regeln anwendbar ist, wo der String landen wird.
Diese Tabelle ist also nach Kontext organisiert, nicht nach Zeichen. Das gleiche Anführungszeichen wird in einer CSV-Zelle verdoppelt, mit Backslash in JSON escaped, in HTML zu " und bleibt völlig allein innerhalb einfacher Anführungszeichen in der Shell. Vier Zeilen, vier Regeln, ein Zeichen.
Die wichtigste Regel ist die, nach der man zuletzt greift: escape an der Grenze, wo der Wert die Kodierung wechselt, und escape ihn nur einmal. Text, der doppelt escaped wird – ein & im Quelltext der Seite, ein \\n in der Ausgabedatei – ist die Signatur eines Wertes, der zwei Encoder durchlaufen hat, die beide davon ausgingen, dass sie erste waren.
JSON-Strings
10JSON erlaubt genau diese Escapes. Ein wörtliches Newline oder Tab innerhalb eines Strings ist ungültig.
| Escapen | Bedeutet | Wenn du es brauchst | Im Kontext |
|---|---|---|---|
| \" | " | Ein doppeltes Anführungszeichen innerhalb eines Strings | "say \"hi\"" |
| \\ | \ | Ein wörtlicher BackslashDer Grund, warum Windows-Pfade JSON brechen. | "C:\\dir" |
| \/ | / | Ein Schrägstrich – optionalRechtlich, aber nicht notwendig; eine Gewohnheit aus dem Einbetten von JSON in <script> Tags. | "a\/b" |
| \n | U+000A | Ein Zeilenvorschub | "line\nline" |
| \r | U+000D | Ein Wagen-Rücklauf | |
| \t | U+0009 | Ein Tab | |
| \b | U+0008 | Ein Backspace | |
| \f | U+000C | Ein Seitenvorschub | |
| \u00e9 | é | Jedes Zeichen nach seinem vierstelligen Code-Punkt | "caf\u00e9" |
| \ud83d\ude00 | 😀 | Ein Zeichen über U+FFFF, als Surrogate-PaarJSON hat keine \u{…}-Form, also nehmen astrale Zeichen zwei Escapes. |
JSON erlaubt genau diese Escapes. Ein wörtliches Newline oder Tab innerhalb eines Strings ist ungültig.
10Eine Obermenge von JSON's, plus die Template-Literal-Escapes.
| Escapen | Bedeutet | Wenn du es brauchst | Im Kontext |
|---|---|---|---|
| \' | ' | Ein einfaches Anführungszeichen innerhalb eines einfach angeführten Strings | |
| \" | " | Ein doppeltes Anführungszeichen innerhalb eines doppelt angeführten Strings | |
| \` | ` | Ein Backtick innerhalb eines Template-Literals | |
| \${ | ${ | Ein wörtliches ${ innerhalb eines Template-LiteralsOhne den Backslash startet es eine Interpolation. | |
| \n | U+000A | Ein Zeilenvorschub | |
| \xe9 | é | Ein Zeichen nach zwei Hex-Ziffern, bis U+00FF | |
| \u00e9 | é | Ein Zeichen nach vier Hex-Ziffern | |
| \u{1f600} | 😀 | Jeder Code-Punkt, jedoch langeBenötigt kein Surrogate-Paar, anders als die vierstellige Form. | |
| \0 | U+0000 | Ein Null-Zeichen | |
| \u2028 | U+2028 | Zeilen-SeparatorGültig in einem JS-String, aber nicht in JSON – ein klassischer JSONP-Bruch. |
Eine Obermenge von JSON's, plus die Template-Literal-Escapes.
8Nur & und < müssen streng in Text escaped werden; Anführungszeichen sind innerhalb von Attributen wichtig.
| Escapen | Bedeutet | Wenn du es brauchst | Im Kontext |
|---|---|---|---|
| & | & | Ein AmpersandEscape dieses zuerst, oder jeder andere Escape verdoppelt sich. | |
| < | < | Ein Kleiner-als-Zeichen, damit es keinen Tag startet | |
| > | > | Ein Größer-als-Zeichen | |
| " | " | Ein doppeltes Anführungszeichen innerhalb eines Attributs | |
| ' | ' | Ein einfaches Anführungszeichen innerhalb eines Attributs' funktioniert auch in HTML5, aber die numerische Form ist überall sicher. | |
| | U+00A0 | Ein geschütztes Leerzeichen | |
| é | é | Jedes Zeichen nach seinem Dezimal-Code-Punkt | |
| é | é | Jedes Zeichen nach seinem Hex-Code-Punkt |
Nur & und < müssen streng in Text escaped werden; Anführungszeichen sind innerhalb von Attributen wichtig.
9Welche Zeichen escaped werden müssen, hängt davon ab, in welchem Teil der URL sie sitzen.
| Escapen | Bedeutet | Wenn du es brauchst | Im Kontext |
|---|---|---|---|
| %20 | Ein Leerzeichen, überall in einer URL gültig | ||
| + | Ein Leerzeichen, aber nur in einem Formular-kodierten Query-StringIn einem Pfad-Segment ist dies ein wörtliches Pluszeichen. | ||
| %25 | % | Ein wörtliches ProzentzeichenVerpasse dies und der Wert dekodiert zweimal. | |
| %2F | / | Ein Schrägstrich innerhalb eines einzelnen Pfad-Segments | |
| %3F | ? | Ein Fragezeichen innerhalb eines Wertes | |
| %26 | & | Ein Ampersand innerhalb eines Parameter-Wertes | |
| %3D | = | Ein Gleichheitszeichen innerhalb eines Parameter-Wertes | |
| %23 | # | Ein Hash, damit es nicht das Fragment startet | |
| %C3%A9 | é | Ein Nicht-ASCII-Zeichen, als seine UTF-8-BytesEin Zeichen kann zwei, drei oder vier Prozent-Gruppen werden. |
Welche Zeichen escaped werden müssen, hängt davon ab, in welchem Teil der URL sie sitzen.
5RFC 4180: Feld in Anführungszeichen, verdopple dann jeden Anführungszeichen drin. Backslashes bedeuten nichts.
| Escapen | Bedeutet | Wenn du es brauchst | Im Kontext |
|---|---|---|---|
| "" | " | Ein Anführungszeichen innerhalb eines angeführten Feldes – verdopple es | "say ""hi""" |
| "a,b" | , | Ein Feld mit dem Trennzeichen – anführen das Feld | |
| "a b" | U+000A | Ein Feld mit einem Zeilenumbruch – anführen das Feld | |
| " a" | Erhaltung führender oder nachgelagerter LeerzeichenUnverständig trimmen viele Parser sie. | ||
| '=SUM(A1) | = | Stoppe eine Tabellenkalkulation, die die Zelle als Formel ausführtGilt für Werte, die mit =, +, - oder @ beginnen. Dies ist Formel-Injection. |
SQL-Literale und Bezeichner
6Lies diese; schreib sie nicht. Verwende stattdessen parametrisierte Abfragen.
| Escapen | Bedeutet | Wenn du es brauchst | Im Kontext |
|---|---|---|---|
| '' | ' | Ein Anführungszeichen innerhalb eines String-Literals – verdopple es | 'O''Brien' |
| "order" | order | Ein reserviertes Wort, das als Spaltenname verwendet wirdDoppelte Anführungszeichen sind der Standard; SQL Server verwendet [Klammern]. | |
| `order` | order | Das gleiche in MySQL und MariaDB | |
| \% | % | Ein wörtliches % innerhalb eines LIKE-Musters | |
| \_ | _ | Ein wörtliches _ innerhalb eines LIKE-Musters | |
| $tag$ … $tag$ | ' | PostgreSQL-Dollar-Quoting – kein Escaping drin überhauptNützlich für Körper von Code, wo Verdopplung jedes Anführungszeichens unlesbar ist. |
Shell-Argumente
6Einfache Anführungszeichen sind wörtlich, doppelte Anführungszeichen expandieren noch Variablen.
| Escapen | Bedeutet | Wenn du es brauchst | Im Kontext |
|---|---|---|---|
| '…' | $ ` \ | Alles drin ist wörtlichDie sicherste Quotierung überhaupt – aber sie kann kein einzelnes Anführungszeichen enthalten. | |
| "…" | * ? space | Globs und Leerzeichen sind sicher, Variablen expandieren immer nochAlways quote variables: "$var", never bare $var. | |
| \ | Ein Leerzeichen in einem unzitierten Dateinamen | ||
| \$ | $ | Ein wörtliches Dollarzeichen innerhalb von doppelten Anführungszeichen | |
| \` | ` | Ein wörtliches Backtick, nicht eine Befehlsersetzung | |
| '\'' | ' | Ein einfaches Anführungszeichen innerhalb einfacher AnführungszeichenSchließe, escape, öffne wieder – es gibt keine Möglichkeit, es direkt zu verschachteln. |