sprain: Dateiname bei File-Upload

Hallo,

Ich habe folgendes Problem:
Per Formular und Perl mache ich einen FileUpload. Nun ist es so, dass, wenn ich eine Datei von Windows hochlade der ganze Pfad als Dateinname angegeben wird, also z.B. "C:\Verzeichnis\bild.jpg" anstatt nur "bild.jpg". Auf einem Mac funktionierts aber.

Weiss jemand Rat?
Ciao & Danke, sprain

Hier noch der Code, wenns hilft :-)

Im HTML:
********
<form action="../../cgi-bin/facelifting/facelifting.cgi" method="post" enctype="multipart/form-data">
[... andere Formularteile ...]
<input type="file" name="file1" class="button">
[... andere Formularteile ...]
</form>

im Perl-Skript:
***************

#************************************************

$fname = $file1;
upload();

sub upload{

$fname =~ s/ /\_/gi;
$fname =~ s/ä/\ae/gi;
$fname =~ s/ö/\oe/gi;
$fname =~ s/ü/\ue/gi;
$fname =~ s/Ä/\Ae/gi;
$fname =~ s/Ö/\Oe/gi;
$fname =~ s/Ü/\Ue/gi;

open(DAT, ">$SAVE_DIRECTORY/$fname") || die 'Error processing file: ',$!;

Dateien in den Binaer-Modus schalten

binmode $file;
binmode DAT;

my $data;
while(read $file,$data,1024) {
  print DAT $data;
}
close DAT;

}

  1. Moin,

    wenn ich eine Datei von Windows hochlade der ganze Pfad als Dateinname angegeben wird, also z.B. "C:\Verzeichnis\bild.jpg" anstatt nur "bild.jpg".

    Es liegt nicht wirklich nur an Windows, sondern in erster linie am Client.
    IE macht es so, mozilla benimmt sich (mittlerweile)

    folgende Zeile schnippelt so lange von vorne an dem File namen rum, bis kein
    backslash mehr da ist.

    while ($fname =~ /\/) { $fname =~ s/^.*\//; }

    HTH,
    bye eddie

  2. Hi,

    Ich habe folgendes Problem:
    Per Formular und Perl mache ich einen FileUpload. Nun ist es so, dass, wenn ich eine Datei von Windows hochlade der ganze Pfad als Dateinname angegeben wird, also z.B. "C:\Verzeichnis\bild.jpg" anstatt nur "bild.jpg". Auf einem Mac funktionierts aber.

    Weiss jemand Rat?

    Du brauchst mehr Rat :)
    Frage mal: Koennte nicht ein boeser Mensch -wie z.B. ein BWfH-
    auf die Idee kommen, ein modifiziertes Formular und modifizierte Dateinamen fuer den Upload zu verwendden um eine Datei mit so einem Namen aufzurufen:
    "blafasel.txt|rm+-Rf+*"

    (Das testest du jetzt aber nicht aus!!!!)

    Wie auch immer: Sorg dafuer das alle Eingaben der
    User nichts anrichten koennen.
    Unten ein Vorschlag:

    ...
    $fname =~ s/[a-z-A-Z0-9-_/\:.]+//gi;

    Loesche gefaehrliche Zeichen und sonstigen Muell, der nicht

    in einem Dateinamen gehoert.

    my @parts = split(/[/\]+/,$fname);

    Splitte das Ding auf

    my $filename = pop(@parts);

    Nehm das letzte Teil

    if (-r "$SAVE_DIRECTORY/$fname") {
      print STDERR "Ueberschreibe alte Datei...\n";
    }

    open(DAT, ">$SAVE_DIRECTORY/$fname") || print STDERR 'Error processing file: ',$!;
    ...

    Uebrigens ist ein die()-Aufruf in ein CGI-Skript unschoen.

    Ciao,
     Wolfgang