Können wir erzwingen, dass perl immer die dreiargumentform von open verwendet wird, wenn es von der Kommandozeile läuft?

8

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:

%Vor%

Oder gefährlicher, wenn Dateiname mit > beginnt, wie >file . In diesem Fall wird die Datei abgeschnitten.

Um mit diesem Problem umzugehen, können wir:

%Vor%
  • Verwenden Sie die Option -i , da perl vor der Verarbeitung prüft, ob die Datei existiert.
  • Verwenden Sie die Option -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.

    
cuonglm 29.11.2014, 03:36
quelle

3 Antworten

2

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

aus %Vor%

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%     
mob 25.09.2015, 05:28
quelle
4

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.

%Vor%

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

%Vor%

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.

%Vor%

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.

    
mob 24.09.2015 14:02
quelle
1

Sie könnten ARGV::readonly in Kombination mit alias verwenden:

%Vor%

Oder erziehe einfach die Leute, die die "schlechten" oneliner eingeben.

    
Patrick J. S. 07.12.2014 06:51
quelle

Tags und Links