Von der Verwendung eval
wird oft abgeraten, da sie die Ausführung von beliebigem Code ermöglicht. Wenn wir jedoch verwenden eval echo
, sieht es so aus, als würde der Rest der Zeichenfolge zu Argumenten für werden, echo
so dass es sicher sein sollte. Habe ich Recht?
20
-n
, können Sie dies einfach mit einer nicht zitierten Variablen wieecho $arguments
oder if$arguments
als Array tunecho "${arguments[@]}"
. Miteval echo
sinnlos ist , selbst wenn es war sicher.Antworten:
Gegenbeispiel:
Die willkürlichen Argumente
echo
hätten schändlicher sein können, als eine Datei mit dem Namen "foo" zu erstellen.quelle
DANGEROUS="hello;ls"
für beliebige Befehle anstelle vonls
.DANGEROUS='$(ls)'
(mehr Flucht kann erforderlich sein).eval echo '"'"$DANGEROUS"'"'
funktionieren Es scheint auf goo.gl/L2pPQPDANGEROUS='">foo"'
. B. ).@ Celada hat eine ausgezeichnete Antwort geliefert. Zu demonstrieren
eval
ist wirklich böse, hier ist etwas Schändlicheres als das Erstellen einer Datei mit dem Namen "foo" :Und natürlich kann es etwas Schändlicheres als etwas Schändlicheres geben, als eine Datei namens "foo" zu erstellen .
quelle
"$THIS"
dass es$THIS
nicht einmal hilft , die Variable mit Anführungszeichen zu versehen, anstatt sie nur so zu haben !eval echo '"'"$DANGEROUS"'"'
. Probieren Sie es auf goo.gl/L2pPQP>foo
, weil "Erstellen einer Datei mit dem Namen" foo "" nicht unbedingt alles ist, was das>foo
tut. Der einzige wirkliche Unterschied, den Ihr Beispiel hat, ist, dass es keine leere Datei zurücklässt. Der Inhalt ist noch weg.Nein, es ist nicht immer sicher. Ein eval kann jeden Befehl ausführen.
Ein sicherer Befehl wie dieser (das Datum wird nicht ausgeführt, da es in einfachen Anführungszeichen steht):
Wird bei Verwendung mit eval gefährlich:
Natürlich kann Datum ein beliebiger Befehl sein.
Eine Möglichkeit, dies zu verbessern, besteht darin, zusätzlich die Argumente zu eval zu zitieren:
Normalerweise ist es jedoch schwierig, einen Ausdruck zweimal richtig zu zitieren.
Und es wird unmöglich, das korrekte Zitieren zu kontrollieren, wenn der Ausdruck von einem externen Angreifer gesetzt werden könnte, wie zum Beispiel:
quelle
Zwar muss
eval
immer mit Vorsicht vorgegangen werden, aber dieeval echo
Konstruktion ist nicht immer sinnlos und kann sicher verwendet werden. Ich brauchte es kürzlich, um mehrere Klammererweiterungen in der Reihenfolge zu bewerten, in der ich sie benötigte.bash
Führt mehrere Klammererweiterungen von links nach rechts durcherweitert um
aber ich musste die zweite Klammer-Erweiterung zuerst machen und nachgeben
Das Beste, was ich mir dafür einfallen lassen konnte, war
Dies funktioniert, weil die einfachen Anführungszeichen den ersten Satz von geschweiften Klammern vor einer Erweiterung während des Parsens der
eval
Befehlszeile schützen und sie durch die von aufgerufene Subshell erweitern lasseneval
.Möglicherweise gibt es ein ausgeklügeltes Schema mit geschachtelten Klammererweiterungen, das dies in einem Schritt ermöglicht, aber wenn es etwas gibt, bin ich zu alt und dumm, um es zu sehen. Es gibt auch andere Muscheln
bash
, mit denen sich solche Dinge aufgeräumter erreichen lassen. Diese Verwendung voneval
ist jedoch in jedem Fall sicher, da es sich bei den Argumenten um feste Zeichenfolgen handelt, die keine Parametererweiterungen enthalten.quelle
eval xargs -I_ cat _/'{11..15}'/{8..5}.jpg