Insegura $ ENV {entorno} mientras se ejecuta con el parámetro -T
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.
Solución
2ª Edición de la respuesta ??h3>
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 ??h3>
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.