Pregunta

Bueno, intentado y no es así, aquí estoy de nuevo.

necesito para que coincida con mi patrón de ruta abs.

 /public_html/mystuff/10000001/001/10/01.cnt

Estoy en el modo de mancha etc ..

#!/usr/bin/perl -Tw
use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
$ENV{PATH} = "bin:/usr/bin";
delete ($ENV{qw(IFS CDPATH BASH_ENV ENV)});

Es necesario abrir el mismo archivo un par de veces o más y me obliga a olor sexual untaint el nombre del archivo cada vez. A pesar de que puede estar haciendo algo más equivocado, todavía necesito ayuda para escribir este patrón para futuras referencias.

my $file = "$var[5]";
if ($file =~ /(\w{1}[\w-\/]*)/) {
$under = "/$1\.cnt";
} else {
ErroR();
}

Se puede ver por mi intento de principiante que estoy cerca a despistados.

he tenido que añadir la barra diagonal y extensión a $1 debido a mi mal construido, pero trabajando, expresiones regulares.

Por lo tanto, necesito ayuda para aprender a arreglar mi expresión tan $1 representa /public_html/mystuff/10000001/001/10/01.cnt

Alguien podría sostener mi mano aquí y me muestran cómo hacer:

$file =~ /(\w{1}[\w-\/]*)/ coincide con mi /public_html/mystuff/10000001/001/10/01.cnt ruta absoluta?

Gracias por cualquier ayuda.

¿Fue útil?

Solución

Editar Uso $ en el patrón (como lo hacía antes) no es aconsejable, ya que aquí puede igualar \n al final del nombre de archivo. Utilice \z lugar porque sin ambigüedades coincide con el final de la cadena.

Sea lo más específico posible en lo que a juego:

my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';

if ( $fn =~ m!
    ^(
        /public_html
        /mystuff
        /[0-9]{8}
        /[0-9]{3}
        /[0-9]{2}
        /[0-9]{2}\.cnt
     )\z!x ) {
     print $1, "\n";
 }

Alternativamente, se puede reducir el espacio vertical tomada por el código poniendo el lo que supongo que ser un '/public_html/mystuff' prefijo común en una variable y la combinación de diversos componentes en una construcción de qr// (ver perldoc perlop ) y luego usar el operador condicional ?: :

#!/usr/bin/perl

use strict;
use warnings;

my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';
my $prefix = '/public_html/mystuff';
my $re = qr!^($prefix/[0-9]{8}/[0-9]{3}/[0-9]{2}/[0-9]{2}\.cnt)\z!;

$fn = $fn =~ $re ? $1 : undef;

die "Filename did not match the requirements" unless defined $fn;
print $fn, "\n";

Además, no puedo conciliar con una ruta relativa como lo hace en

$ENV{PATH} = "bin:/usr/bin";

con el uso de modo de mancha. Quiso decir

$ENV{PATH} = "/bin:/usr/bin";

Otros consejos

Usted habla de untainting la ruta del archivo cada vez. Eso es probablemente porque no está compartimentar los pasos del programa.

En general, rompo este tipo de programas en etapas. Una de las primeras etapas es la validación de datos. Antes de dejar que el programa continúe, puedo validar todos los datos que pueda. Si alguna de que no se ajusta a lo que espero, no dejo que el programa continúe. No quiero llegar a mitad de camino a través de algo importante (como la inserción de cosas en una base de datos) sólo para descubrir que algo está mal.

Así que, cuando recibe los datos, untaint todo y almacenar los valores de una nueva estructura de datos. No utilice los datos originales o las funciones CGI después de eso. El módulo CGI está ahí sólo para entregar datos a su programa. Después de eso, el resto del programa debe saber tan poco de CGI como sea posible.

No sé lo que está haciendo, pero es casi siempre un olor diseño tomar los nombres de archivo reales como entrada.

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