Das Ausführen von perl
Einzeilern über die Befehlszeile hat Auswirkungen auf die Sicherheit .
Das Problem ist, dass die Optionen -n/-p
den Diamantoperator <>
auslösen, der zwei Argumente vom Typ open
verwendet. Wenn der Dateiname also Sonderzeichen enthält, funktioniert perl
nicht wie erwartet:
Oder gefährlicher, wenn Dateiname mit >
beginnt, wie >file
. In diesem Fall wird die Datei abgeschnitten.
Um mit diesem Problem umzugehen, können wir:
ARGV::readonly
module von uns selbst: -i
, da perl
vor der Verarbeitung prüft, ob die Datei existiert. -T
, um den Taint-Modus zu aktivieren. Ich denke, dass alle Lösungen dieses Problem beheben können, aber auch ihre Nebenwirkungen haben. Wenn wir perl
immer mit dem Argument form von open
erzwingen können, wird es eine bessere Lösung sein.
Ich frage mich, ob wir das machen können, erzwinge perl
immer die Argumentform von open
?
Hinweis
Die Frage gilt nur für den Fall, dass perl
one Liner von der Kommandozeile aus ausgeführt werden, da wir (natürlich) immer drei Argumentformen von open
im Perl-Skript verwenden können.
In meiner vorherigen Antwort stellte ich die Hypothese auf, dass ARGV
filehandle magic das offene 2-Argument emuliert, aber nicht durch Perls eingebaute open
-Funktion ging. Also habe ich es noch genauer untersucht und ich denke, ich habe eine Lösung für dieses Problem gefunden.
Die Funktion Perl_nextargv
in doio.c
ist, wo Perl E / A um das ARGV
-Dateihandle ausführt.
Innerhalb der while
-Schleife dieser Funktion gibt es zwei Arten von Aufrufen zum Öffnen von Dateihandles. Wenn LIKELY(PL_inplace)
wahr ist (d. H. Wenn Perl mit dem Schalter -i
ausgeführt wird), lautet der Aufruf do_open_raw
. Wenn LIKELY(PL_inplace)
falsch ist, lautet der Aufruf do_open6
. Letzterer Aufruf ist in der Lage, Pipes zu externen Befehlen zu öffnen, was das OP im Allgemeinen nicht will.
Hier ist die Lösung: Ersetzen Sie in der Quelldatei doio.c
diese do_open6
-Aufrufe in Perl_nextargv
durch do_open_raw
und erstellen Sie perl
aus der Quelle neu. Für Perl-5.22.0 sieht der Originalcode wie
und der geänderte Code sieht wie
aus %Vor% (Der Parameter nomagicopen
ist wahr, wenn Sie die neue <<>>
-Syntax verwenden von Perl 5.22.0 Ich denke, wir könnten es einfach auf true
am Anfang der Funktion setzen und nichts anderes ändern, aber die obige Änderung ist eine allgemeine Lösung für ältere Perls. p>
Beispielausgabe:
%Vor% Sie möchten das wahrscheinlich nur für Einzeiler tun (indem Sie den Schalter -e
verwenden), deshalb sollten Sie ARGV::readonly
für diesen Zweck anpassen.
Um zu erzwingen, dass dieses Paket systemweit verwendet wird, können Sie einen Alias als Patrick J.S. schlägt vor
%Vor% oder setzen Sie eine systemweite PERL5OPT
Variable
Und wenn Sie paranoider sein wollen, verstecken Sie Ihr System perl (benennen Sie es in etwas unverständliches um) und ersetzen Sie es durch einen Wrapper
%Vor% Der Shell-Wrapper berücksichtigt weiterhin alle benutzerdefinierten Anpassungen in PERL5OPT
Im allgemeinen Fall können Sie den Mechanismus CORE::GLOBAL
verwenden, um die eingebaute Funktion open
zu überschreiben, z. B.
und wenn dieses Modul benutzt wird, werden Sie jemanden finden, der gerade einen 2-arg open
Call benutzt. Leider denke ich, dass der Mechanismus der ARGV
-Dateihandle-Magie dies umgeht, also hilft es immer noch nicht mit doofen Dateinamen auf der Kommandozeile in einem Einzeiler.
Sie könnten ARGV::readonly
in Kombination mit alias
verwenden:
Oder erziehe einfach die Leute, die die "schlechten" oneliner eingeben.