Question

Lorsque je tente le dernier exemple de perlfaq5: Comment-do-I-comte-le-nombre-de-lignes-en-un fichier je reçois un message d'erreur. Que dois-je faire pour obtenir le travail de script?

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

Sortie:

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

La solution

2e édition de réponse

Le manuel décrit perldoc perlsec taint mode (il y a aussi perldoc Taint pour un module lié au mode Taint).

En partie, il illustre:

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

Après la $ENV{PATH} = undef; dans votre code, je me mis en garde contre CDPATH. Donc, adapter ce code, je (perl2.pl nouveau):

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

Avec la réponse '13 perl2.pl » cette fois-ci. Ceci est beaucoup moins draconienne que la 1ère édition de la réponse.

1ère édition de réponse

Cette solution draconienne 'fonctionne':

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

Si le script est appelé « perl2.pl », puis perl -T perl2.pl en cours d'exécution vous obtenez le résultat '16 perl2.pl »(si vous n'avez pas des lignes vides de fuite).

Je l'appelle « draconienne » parce que j'ai unset toutes les variables de l'environnement, au coup par coup.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top