Escapen hängt vom Kontext ab
Eine Zeichenkette ist nie abstrakt „escaped“; sie wird für eine bestimmte Stelle escaped, in die sie gleich eingefügt wird, und jede Stelle hat eigene Regeln. Derselbe Text braucht \" in JSON, '' in SQL, '\'' in einer Shell und " in HTML. Das falsche zu verwenden ist, wie Injection-Fehler entstehen: HTML-Escaping, bevor Text in einen JavaScript-String kommt, oder Shell-Escaping mit doppelten Anführungszeichen, bei dem $ aktiv bleibt.
| Kontext | Was escaped werden muss | Wie |
|---|---|---|
| JSON-String | " \ und Steuerzeichen | \" \\ \n \t \u00XX |
| Shell, einfache Anführungszeichen | ' | '\'' (schließen, wörtliches Anführungszeichen, wieder öffnen) |
| Shell, doppelte Anführungszeichen | " \ $ ` und ! in interaktiver bash | Backslash |
| SQL-Literal | ' | '' (MySQL akzeptiert auch \') |
| Regex | . * + ? ^ $ { } ( ) [ ] | \ / | Backslash |
| C / Go / Rust / Java | " \ Zeilenumbruch Tab | \" \\ \n \t \xHH \uHHHH |
| CSV-Feld | , " Zeilenumbruch | in Anführungszeichen setzen, Anführungszeichen verdoppeln |
| HTML- / XML-Text | & < > " ' | & < > " ' / ' |
| YAML | Alles Mehrdeutige: yes, no, 1.0, führendes * oder &, Doppelpunkte | In doppelte Anführungszeichen mit JSON-Escapes |
Die Shell im Besonderen
Einfache Anführungszeichen sind das einzige vollständig sichere Quoting in POSIX-Shells: Nichts darin wird interpretiert, und das einzige Zeichen, das nicht vorkommen darf, ist das einfache Anführungszeichen selbst; man schreibt es, indem man die Zeichenkette beendet, ein escaptes Anführungszeichen anfügt und neu beginnt: 'it'\''s'. Doppelte Anführungszeichen expandieren weiterhin $variablen, `befehle` und \, sie sind also für den Fall, dass Sie Expansion wollen. Wenn Sie Daten aus Code übergeben, bauen Sie gar keine Kommandozeilen: Verwenden Sie ein Argument-Array (execve, subprocess.run([...]), exec.Command), dann wird Escapen überflüssig.
SQL im Besonderen
Anführungszeichen zu verdoppeln ist korrektes SQL, aber nicht die Art, wie Anwendungen Werte übergeben sollten. Parametrisierte Abfragen ($1, ?, :name) senden den Wert getrennt von der Anweisung und machen Injection unmöglich. Nehmen Sie den SQL-Escaper für Ad-hoc-Abfragen in einer Konsole, nicht im Code.
Fragen
Wie bekomme ich ein einfaches Anführungszeichen in eine einfach gequotete Shell-Zeichenkette?
Die Zeichenkette beenden, ein escaptes Anführungszeichen anfügen, neu beginnen: 'it'\''s'. Oder $'it\'s' in bash/zsh verwenden, das Backslash-Escapes unterstützt.
Warum steht in meinem JSON \u00e9 statt é?
Manche Encoder escapen alles Nicht-ASCII zur Sicherheit in 7-Bit-Kanälen. Es ist trotzdem gültig und dekodiert zur selben Zeichenkette. JSON.stringify in JavaScript und json.dumps mit ensure_ascii=False in Python behalten die Zeichen.
Was ist der Unterschied zwischen Escapen und Kodieren?
Escapen schützt wenige Sonderzeichen, damit Text innerhalb einer Syntax stehen kann; Kodieren (Base64, URL) wandelt die ganze Zeichenkette in ein anderes Alphabet. Base64- und URL-Kodierung sind hier enthalten, weil sie oft im selben Atemzug gebraucht werden.
Kann ich für einen Regex in einer bestimmten Sprache escapen?
Der Regex-Escaper deckt die Metazeichen ab, die alle gängigen Engines teilen (PCRE, JavaScript, Python, Go RE2, Java). Innerhalb einer Zeichenklasse [] zählen nur ] \ ^ und -; das Tool escaped konservativ, damit das Ergebnis überall funktioniert.