Sanitize Benutzereingaben in bash für Sicherheitszwecke
Frage
Wie kann ich Benutzereingaben in einem Bash-Skript sanieren, so dass ich dann als Argument an einem anderen Shell-Programm übergeben Sie sie? Ich möchte folgendes verhindern:
INPUT="filename;rm -rf /"
ls $INPUT
Ich dachte, es sollte genug sein, um die Benutzereingabe in doppelten Anführungszeichen zu umgeben, etwa so:
ls "$INPUT"
aber was, wenn es ein doppeltes Anführungszeichen in $INPUT
?
Oder bash bereits mit diesem Problem umgehen?
Lösung
Die Short
Bash beschäftigt sich schon damit. Zitiert reicht es aus.
ls "$INPUT"
The Long
Eine grobe Anleitung, wie die Shell parst diese Zeile ist:
"ls \"$INPUT\"" # Raw command line.
["ls", "\"$INPUT\""] # Break into words.
["ls", "\"filename; rm -rf /\""] # Perform variable expansion.
["ls", "\"filename; rm -rf /\""] # Perform word splitting (no change).
["ls", "filename; rm -rf /"] # Remove quotes.
Aufgrund der Zitate der $INPUT
Variable unterliegt keinem Wort Spaltung. Die ls
wird eine Datei mit dem Namen filename; rm -rf /
suchen.
Wenn Sie es nicht zitieren haben dann würde die Erweiterung anders vorgehen:
"ls $INPUT" # Raw command line.
["ls", "$INPUT"] # Break into words.
["ls", "filename; rm -rf /"] # Perform variable expansion.
["ls", "filename;", "rm", "-rf", "/"] # Perform word splitting.
Sie können zumindest Trost haben, dass dies nicht wirklich rm -rf /
ausführen. Vielmehr wird es jeder dieser Zeichenfolgen als Dateinamen ls
geben. Sie werden einige Dateien ls
Sie nicht die Absicht haben, aber zumindest werden sie nicht versehentlich unerwünschte Befehle auszuführen.
jkugelman$ VAR='.; echo hi'
jkugelman$ ls $VAR
ls: .;: No such file or directory
ls: echo: No such file or directory
ls: hi: No such file or directory
Auszüge aus "man bash":
ANBIETEN
Zitiert wird verwendet, um die besondere Bedeutung bestimmter Zeichen oder Worte mit der Schale zu entfernen. Zitiert kann für Sonderzeichen zu deaktivieren Sonderbehandlung verwendet werden, um zu verhindern, reservierte Worte als solche erkannt zu werden, und Parameter Expansion zu verhindern.
EXPANSION
Die Expansion wird auf der Kommandozeile durchgeführt, nachdem es aufgeteilt in Worte gewesen. Es gibt sieben Arten Expansionsdurchgeführt: Verstrebung Expansion tilde Expansions, Parameter- und Variablenerweiterung, Befehl Substitution, arithmetische Erweiterung, einzelne Wörter aufgespalten, und Pfadname Expansion.
Nur Klammer Expansion, einzelne Wörter aufgespalten, und Pfadname Expansion kann die Anzahl der Wörter der Änderung Erweiterung; andere Erweiterungen zu erweitern, um ein einzelnes Wort, ein einziges Wort. Die einzigen Ausnahmen sind die Erweiterungen von
"$@"
und"${name[@]}"
wie oben erläutert (siehe Parameter).Word-Splitting
Die Schale scannt die Ergebnisse der Parameter, Kommando-Substitutionen und arithmetische Expansions Das ist nicht in doppelten Anführungszeichen für Wort Spaltung auftreten.
Quote Entfernen
Nach den vorangegangenen Erweiterungen, alle unquoted Vorkommen der Zeichen
\
,'
und"
, die nicht tat ergeben sich aus einem der oben genannten Erweiterungen entfernt werden.