Domanda

Bene, ho provato e non è riuscito così, eccomi di nuovo qui.

Ho bisogno di abbinare il mio modello percorso addominali.

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

Sono in modalità macchia 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)});

Ho bisogno di aprire lo stesso file un paio di volte o più e Taint mi costringe a untaint il nome del file ogni volta. Anche se posso fare qualcosa che non va, ho ancora bisogno di aiuto per costruire questo modello per riferimento futuro.

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

Si può vedere dal mio tentativo principiante che io sono vicino a Clueless.

ho dovuto aggiungere la barra e l'estensione a $1 a causa del mio mal costruito, ma lavorando, regex.

Così, ho bisogno di aiuto per imparare come risolvere la mia espressione in modo $1 rappresenta /public_html/mystuff/10000001/001/10/01.cnt

Qualcuno potrebbe tenere la mia mano qui e mi mostra come fare:

$file =~ /(\w{1}[\w-\/]*)/ corrispondono alla mia /public_html/mystuff/10000001/001/10/01.cnt percorso assoluto?

Grazie per qualsiasi assistenza.

È stato utile?

Soluzione

Modifica Utilizzo $ nel motivo (come ho fatto prima) non è consigliabile qui perché può abbinare \n alla fine del nome del file. Utilizzare \z invece perché corrisponde in modo inequivocabile la fine della stringa.

Puoi essere il più specifici possibile in quello che stai la Sua richiesta:

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";
 }

In alternativa, è possibile ridurre lo spazio verticale presa dal codice mettendo il quello che presumo essere un '/public_html/mystuff' prefisso comune in una variabile e combinando i vari componenti in un costrutto qr// (vedi perldoc perlop ) e quindi utilizzare l'operatore condizionale ?: :

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

Inoltre, non riesco a conciliare utilizzando un percorso relativo come si fa in

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

con l'utilizzo di modalità di contaminazione. Cercavi

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

Altri suggerimenti

Si parla di untainting il percorso del file ogni volta. Questo è probabilmente perché non si è in compartimenti i tuoi passi di programma.

In generale, mi rompo questo genere di programmi in fasi. Una delle fasi precedenti è la convalida dei dati. Prima di lasciare che il programma continui, a convalidare tutti i dati che posso. Se niente di tutto ciò non va bene quello che mi aspetto, non lasciare che il programma continui. Non voglio arrivare a metà strada attraverso qualcosa di importante (come l'inserimento roba in un database) solo per scoprire che qualcosa non va.

Quindi, quando si ottiene i dati, untaint tutto e memorizzare i valori in una nuova struttura di dati. Non utilizzare i dati originali o le funzioni CGI dopo. Il modulo CGI è proprio lì a portata di mano i dati al vostro programma. Dopo di che, il resto del programma dovrebbe sapere come poco di CGI possibile.

Non so quello che stai facendo, ma è quasi sempre un odore di progettazione di prendere i nomi dei file effettivi come input.

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