Angenommen, ich habe ein Bash-Skript, das als Konfigurationsdatei für ein anderes Bash-Skript fungiert:
config.sh:
verbose=yes
echo "Malicious code!"
name=test
script.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 abgelegt ist, ausgeführt wird:
$ ./script.sh
Malicious code!
After sourcing: verbose='yes', name='test'
Um es sicherer zu machen, dachte ich, ich würde Zuweisungsoperationen ausgraben und nur diese ausführen. Ich würde dies erreichen, indem ich source
ein "hier-Dokument" übergebe:
script.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; er ist nur ein Platzhalter.) Leider scheint die Quelle mit den folgenden Dokumenten nicht gut zu spielen:
./script.sh: line 1: source: filename argument required
source: usage: source filename [arguments]
After sourcing: verbose='', name=''
Natürlich könnte ich eine beliebige Anzahl von Dingen tun, um Konfigurationsdaten aus einer Datei zu erhalten, und das ist wahrscheinlich sowieso sicherer.
Aber ich habe immer noch diesen Juckreiz; Ich möchte herausfinden, ob das, was ich versucht habe, funktionieren kann. Irgendwelche Vorschläge?
quelle
<<EOF
) wie eine normale Eingabeweiterleitung (< file
)source < file
funktioniert und nicht funktioniert - essource
muss ein Dateinamenargument vorhanden sein. Daher benötigen Sie process substitution (<(command)
), das wie ein Dateinamenargument aussieht.while IFS== read -r var value; do case $var in |*[!0-9A-Z_a-z]*) complain;; *) eval "config_$var=\$value";; esac; done <config
(Warnung: getippt in meinem Browser, ! Test es ) Vergessen Sie nicht , keine Variablen zu erlauben den Import wiePATH
,IFS
... Ein Präfix wieconfig_
ist ein sicherer Ansatz./dev/fd/[num]
. Dies zu emulieren ist einfach :3<<HEREDOC . /dev/fd/3\n*file contents*\nHEREDOC\n
. Prozess Substitution in der Regel ist ein Rohr, während Heredocs sind in der Regel die Schale TMPFILES Löschungen vor Gabe sie aus - so dass sie nur als Deskriptoren vorhanden sind . indash
ihnen sind Rohre. Der andere große Unterschied ist, dass Sie fd[num]
für Heredocs angeben können .Antworten:
source
benötigt einen Dateinamen, Sie können keine Eingabe darauf umleiten.Auf meinem System konnte ich stattdessen die Prozessersetzung verwenden:
Ersetzen Sie
=
durch den entsprechenden regulären Ausdruck.quelle
delete --recursively /this/important/dir #=
=
war nur ein Platzhalter.3<<HEREDOC . /dev/fd/3\nand so on...
;
Füllen unterwerfen lassen . Darüber hinaus können Sie den Deskriptor explizit benennen und nummerieren, was meiner Meinung nach nicht durch Substitutionen möglich ist. Sie können auch führende Tabs automatisch entfernen lassen - und so kann der Code ziemlich analysiert werden - es sieht in einem Kommentar nicht gut aus, weil ich einen Schrägstrich machen muss und so weiter, aber es hat viel mehr Potenzial - und es ist portabel. Wenn Sie nicht mögen.dot
, sollten Sie es alias - es ist sicherer alssource
gewöhnlich.Ausgabe:
quelle
Sie können es direkt
eval
:Die Beschaffung ist im Wesentlichen dasselbe wie:
Beachten Sie jedoch, dass Personen möglicherweise alle Codez-Kinz auf der rechten Seite des Gleichheitszeichens ausführen:
Sie brauchen einen besseren Filter.
quelle