Innerhalb einer Programmiersprache führe ich einen einfachen Shell-Befehl aus
cd var; echo > create_a_file_here
Dabei ist var eine Variable, die eine Zeichenfolge (hoffentlich) eines Verzeichnisses an der Stelle enthält, an der ich die Datei "create_a_file_here" erstellen möchte. Wenn jemand diese Codezeile sieht, kann er ausgenutzt werden, indem beispielsweise Folgendes zugewiesen wird:
var = "; rm -rf /"
Die Dinge können ziemlich hässlich werden. Eine Möglichkeit, den obigen Fall zu vermeiden, besteht darin, die Zeichenfolge in var nach Sonderzeichen wie ';' zu durchsuchen. vor dem Ausführen des Shell-Befehls, aber ich bezweifle, dass dies alle möglichen Exploits abdeckt.
Kennt jemand einen guten Weg, um sicherzustellen, dass "cd var" nur ein Verzeichnis ändert und sonst nichts?
sh
oder erstellen Sie eine eigene Programmiersprache mit einer ähnlichen Syntax, die jedoch erweitert wird, var
anstatt dass Sie schreiben müssen cd "$var"
? Oder ist das bash
mit shopt -s cdable_vars
? Oh, ich denke du meinst, dass ein anderes Programm eine Shell zwingt, um diese Befehle auszuführen. Also zitieren Sie einfach var
, aber stellen Sie sicher, dass es kein Anführungszeichen selbst enthält ...
s='"'; echo "$s"
Drucke "
.
var=untrusted string
im übergeordneten Programm, ebenso var
wie eine Umgebungsvariable, die bereits beim Aufrufen festgelegt wurde sh
. Dann müssen Sie es nur jedes Mal zitieren, wenn Sie es erweitern, was zuverlässig möglich ist. Ah, ich sehe , dass Idee ist bereits Teil von Stéphane Antwort> <.
var
als Argument übergeben. ZB der Aufrufsh
mit Argumenten-c
,'cd "$1"; echo > create_a_file_here'
,'sh'
,var
Arbeiten und benötigt keine Änderungenvar
. Das'sh'
Argument wird als übergeben$0
.