Frage

Wenn ich das letzte Beispiel von ausprobierePerlfaq5: Wie-do-i-count-the-number-of-lines-in-a-file? Ich bekomme eine Fehlermessung. Was soll ich tun, um das Skript zum Laufen zu bringen?

#!/usr/local/bin/perl -T
use warnings;
use 5.012;

$ENV{PATH} = undef;

my $filename = 'perl2.pl';

if( $filename =~ /^([0-9a-z_.]+)\z/ ) {
    my $lines = `/usr/bin/wc -l $1`;
    print $lines;
}

Ausgabe:

Insecure $ENV{ENV} while running with -T switch at ./perl1.pl line 10.
War es hilfreich?

Lösung

2. Ausgabe der Antwort

Das perldoc perlsec Das Handbuch beschreibt den unterbrochenen Modus (es gibt auch perldoc Taint für ein Modul im Zusammenhang mit dem Makelmodus).

Zum Teil zeigt es:

$path = $ENV{'PATH'};       # $path now tainted

$ENV{'PATH'} = '/bin:/usr/bin';
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

$path = $ENV{'PATH'};       # $path now NOT tainted
system "echo $data";        # Is secure now!

Nach dem $ENV{PATH} = undef; In Ihrem Code wurde ich vor CDPath gewarnt. Wenn ich diesen Code anpasste, habe ich also verwendet (Perl2.PL wieder):

#!/usr/bin/env perl -T
use warnings;
use 5.012;

delete @ENV{'PATH', 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

my $filename = 'perl2.pl';

if ($filename =~ /^([0-9a-z_.]+)\z/)
{
    my $lines = `/usr/bin/wc -l $1`;
    print $lines;
}

Mit der Antwort '13 Perl2.pl 'diesmal. Dies ist weit weniger drakonisch als die 1. Ausgabe der Antwort.

1. Ausgabe der Antwort

Diese drakonische Lösung "funktioniert":

#!/usr/bin/env perl -T
use warnings;
use 5.012;

foreach my $env (keys %ENV)
{
    undef $ENV{$env};
}

my $filename = 'perl2.pl';

if ($filename =~ /^([0-9a-z_.]+)\z/)
{
    my $lines = `/usr/bin/wc -l $1`;
    print $lines;
}

Wenn das Skript "Perl2.PL" genannt wird, dann liefern Sie perl -T perl2.pl Ergibt die Antwort '16 Perl2.PL '(wenn Sie keine nachfolgenden leeren Linien haben).

Ich nenne es "Draconian", weil ich jede Umgebungsvariable, stückweise, nicht festgelegt habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top