Pregunta

Cuando intento el último ejemplo de perlfaq5:? ¿Cómo-do-I-count-la-número-de-línea-en-un-archivo me sale un mensaje de error aparecerá. ¿Qué debo hacer para conseguir el funcionamiento de guión?

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

Salida:

Insecure $ENV{ENV} while running with -T switch at ./perl1.pl line 10.
¿Fue útil?

Solución

2ª Edición de la respuesta

El manual perldoc perlsec describe el modo de mancha (también hay perldoc Taint para un módulo relacionado con el modo de Taint).

En parte, se ilustra:

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

Después de la $ENV{PATH} = undef; en su código, que fue advertido acerca CDPATH. Por lo tanto, la adaptación de ese código, he usado (perl2.pl de nuevo):

#!/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 las respuestas '13 'perl2.pl este momento. Esto es mucho menos draconianas que la primera edición de la respuesta.

1ª Edición de respuesta

Esta solución draconiana 'funciona':

#!/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 el script se llama '' perl2.pl, a continuación, ejecutar perl -T perl2.pl Genera la Respuesta '16 perl2.pl'(si usted no tiene ninguna línea en blanco de cola).

Me llaman 'draconiana' porque he desarmado cada variable de entorno, poco a poco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top