Domanda

Quando provo l'ultimo esempio da perlfaq5:? How-do-I-count-il-numero-di-linee-in-a-file di ottengo un errore-messaggio. Cosa devo fare per ottenere il lavoro sceneggiatura?

#!/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;
}

Output:

Insecure $ENV{ENV} while running with -T switch at ./perl1.pl line 10.
È stato utile?

Soluzione

2 ° edizione di risposta

Il manuale descrive perldoc perlsec modalità contaminazione (c'è anche perldoc Taint per un modulo relativo alla modalità Taint).

In parte, illustra:

$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!

Dopo la $ENV{PATH} = undef; nel codice, sono stato messo in guardia CDPATH. Quindi, adattando il codice, ho usato (perl2.pl di nuovo):

#!/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;
}

Con la risposta '13 perl2.pl' questa volta. Questo è molto meno draconiana rispetto alla prima edizione della risposta.

1st Edition di risposta

Questa soluzione draconiana 'funziona':

#!/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;
}

Se lo script si chiama '' perl2.pl, perl -T perl2.pl poi correre produce la risposta '16 perl2.pl'(se non si dispone di tutte le righe vuote finali).

io lo chiamo 'draconiana' perché ho unset ogni variabile d'ambiente, frammentario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top