Frage

Nun, ich versucht und sind gescheitert, so, hier bin ich wieder.

Ich brauche meine abs Pfadmuster passen.

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

Ich bin in Taint-Modus 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)});

Ich brauche die gleiche Datei ein paar Mal zu öffnen oder mehr und taint zwingt mich die Dateinamen jedes Mal untaint. Obwohl ich etwas anderes falsch machen kann, ich brauche noch Hilfe dieses Muster für die Zukunft zu bauen.

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

Sie können von meinem Anfänger Versuch sehen, dass ich nahe bin ahnungslos.

Ich hatte den Schrägstrich und Erweiterung $1 hinzuzufügen aufgrund meiner schlecht gebaut, aber die Arbeit, regex.

So muss ich lernen, helfen, wie mein Ausdruck zu beheben, so $1 stellt /public_html/mystuff/10000001/001/10/01.cnt

Könnte jemand meine Hand hält hier und mir zeigen, wie zu machen:

$file =~ /(\w{1}[\w-\/]*)/ meinen absoluten Pfad /public_html/mystuff/10000001/001/10/01.cnt Vorstellungen?

Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Edit: Mit $ im Muster (wie ich zuvor) ist hier nicht ratsam, weil es \n am Ende des Dateinamen übereinstimmen kann. Verwenden \z statt, weil es eindeutig das Ende der Zeichenfolge entspricht.

Seien Sie so genau wie möglich, was Sie passen:

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

Alternativ können Sie auch den vertikalen Raum durch den Code genommen reduzieren, indem sie die Umsetzung, was ich davon ausgehen, ein gemeinsamer Präfix '/public_html/mystuff' in einer Variablen und verschiedene Komponenten in einem qr// Konstrukt (siehe perldoc perlop ) und dann den bedingten Operator ?: :

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

Auch kann ich versöhne keine relativen Pfad, wie Sie in

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

mit Taint-Modus verwenden. Meinen Sie

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

Andere Tipps

Sie sprechen jedes Mal, wenn der Dateipfad über untainting. Das ist wahrscheinlich, weil Sie nicht Ihre Programmschritte Kompartimentierung.

In der Regel habe ich diese Art von Programmen in Phasen aufzuteilen. Einer der früheren Stadien ist die Datenvalidierung. Bevor ich das Programm lassen fortsetzen, zu validieren ich alle Daten, die ich kann. Wenn irgendetwas davon nicht paßt, was ich erwarte, lasse ich nicht das Programm fortsetzen. Ich möchte nicht auf halbem Weg durch etwas Wichtiges bekommen (wie Sachen in eine Datenbank einfügen) nur etwas falsch zu entdecken.

Also, wenn Sie die Daten bekommen, untaint alles davon und speichert die Werte in einer neuen Datenstruktur. Sie nicht die Originaldaten oder die CGI-Funktionen danach verwenden. Das CGI-Modul ist nur da zu Hand Daten zu Ihrem Programm. Danach wird, wie wenig über CGI wie möglich der Rest des Programms kennen sollte.

Ich weiß nicht, was Sie tun, aber es ist fast immer ein Design Geruch tatsächliche Dateinamen als Eingabe zu übernehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top