Nehmen wir an, ich habe ein Bash-Skript, das als Konfigurationsdatei für ein anderes Bash-Skript fungiert:
config.sh:
verbose=yes
echo "Malicious code!"
name=test
Skript.sh:
source config.sh
echo "After sourcing: verbose='$verbose', name='$name'"
Das Problem ist, dass dies nicht sehr sicher ist, da alles, was in config.sh eingegeben wird, ausgeführt wird:
$ ./script.sh
Malicious code!
After sourcing: verbose='yes', name='test'
Um es sicherer zu machen, dachte ich, ich würde Zuweisungsoperationen herauslesen und nur diese ausführen. Ich würde das erreichen, indem ich source
ein „Here-Dokument“ übergebe:
Skript.sh:
source <<EOF
$(grep -P '^\s*\w+=' test.sh)
EOF
echo "After sourcing: verbose='$verbose', name='$name'"
(Ja, ich weiß, dass der reguläre Ausdruck nicht so stark ist; es handelt sich nur um einen Platzhalter.) Leider scheint die Quelle nicht gut mit den folgenden Dokumenten zu funktionieren:
./script.sh: line 1: source: filename argument required
source: usage: source filename [arguments]
After sourcing: verbose='', name=''
Natürlich könnte ich alles Mögliche tun, um Konfigurationsdaten aus einer Datei abzurufen, und das ist wahrscheinlich sowieso sicherer.
Aber ich habe immer noch diesen Juckreiz; ich möchte herausfinden, ob das, was ich versucht habe, funktioniert. Irgendwelche Vorschläge?
Antwort1
source <(cat << EOF
A=42
EOF
)
echo $A
Ausgabe:
42
Antwort2
source
einen Dateinamen benötigt, können Sie die Eingabe nicht dorthin umleiten.
Auf meinem System konnte ich stattdessen die Prozesssubstitution verwenden:
source <( grep = test.sh )
Ersetzen Sie es =
durch den entsprechenden regulären Ausdruck.
Antwort3
Sie können eval
es direkt verwenden:
eval "$(grep -P '^\s*\w+=' config.sh)"
#quotes needed if you want the full content of the file (including newlines etc.)
Sourcing ist im Wesentlichen dasselbe wie:
eval "$(cat file)"
Beachten Sie jedoch, dass auf der rechten Seite des Gleichheitszeichens alle möglichen Codes ausgeführt werden könnten:
a=$(evil_code_here)
b=`evil_code_here`
c="something" evil_code_here
#etc.
Sie benötigen einen besseren Filter.