Question

Eh bien, j'ai essayé et échoué, je suis ici à nouveau.

Je dois correspondre à mon modèle de chemin abs.

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

Je suis en mode etc .. entacher

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

Je dois ouvrir le même fichier une ou deux fois ou plus et les forces de moi à taint untaint le nom du fichier à chaque fois. Bien que je sois en train de faire quelque chose d'autre mal, je encore besoin d'aide la construction de ce modèle pour référence ultérieure.

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

Vous pouvez voir par ma tentative de débutant que je suis proche de la moindre idée.

Je devais ajouter la barre oblique et l'extension à $1 en raison de mon mal construit, mais en travaillant, regex.

, je dois donc aider à apprendre à fixer mon expression si $1 représente /public_html/mystuff/10000001/001/10/01.cnt

Quelqu'un pourrait-il me tenir la main ici et me montrer comment faire:

$file =~ /(\w{1}[\w-\/]*)/ correspondent à mes /public_html/mystuff/10000001/001/10/01.cnt chemin absolu?

Merci pour toute aide.

Était-ce utile?

La solution

Modifier Utilisation $ dans le modèle (comme je l'ai fait avant) ne soit pas là conseillé car il peut correspondre \n à la fin du nom de fichier. Utilisez \z à la place, car il correspond sans ambiguïté la fin de la chaîne.

Soyez aussi précis que possible dans ce que vous êtes correspondant à:

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

Vous pouvez réduire l'espace vertical prise par le code en mettant la ce que je suppose être un '/public_html/mystuff' préfixe commun dans une variable et en combinant différents composants dans une construction de qr// (voir perldoc perlop ) puis utilisez l'opérateur conditionnel ?: :

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

En outre, je ne peux pas concilier l'aide d'un chemin relatif comme vous le faites dans

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

avec l'aide du mode taint. Vouliez-vous dire

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

Autres conseils

Vous parlez blanchissez le chemin du fichier à chaque fois. C'est probablement parce que vous n'êtes pas compartimenter vos pas de programme.

En général, je rompre en ce genre de programmes en étapes. L'une des premières étapes est la validation des données. Avant de laisser le programme continuer, je valider toutes les données que je peux. Si tout cela ne correspond pas ce que je pense, je ne laisse pas le programme continue. Je ne veux pas à mi-chemin à travers quelque chose d'important (comme l'insertion des choses dans une base de données) pour découvrir quelque chose ne va pas.

Alors, quand vous obtenez les données, untaint tous et stocker les valeurs dans une nouvelle structure de données. Ne pas utiliser les données d'origine ou les fonctions CGI après. Le module CGI est juste là pour remettre les données à votre programme. Après cela, le reste du programme devrait savoir aussi peu CGI que possible.

Je ne sais pas ce que vous faites, mais il est presque toujours une odeur de conception à prendre des noms de fichiers réels en entrée.

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