Hallo 1211chef,
# […] my $fname = $q->param ("upload");
Hier setzt du $fname
auf den Parameter aus der URL.
$fname = ~s/(?:\\|\/)([^\\\/]+)$/$1/g;
Hier ersetzt du Zeichen.
my ($a,$end) = split(/\.$+/, $fname); $end = lc($end); $fname = $ID.time().".".$end;
Und hier schnappst du dir die Endung und ersetzt den Dateinamen durch eine ID, deinen Timestamp und die Endung. Die ID kommt wieder aus der URL. Und ID ist auch nicht escaped noch wird sonstwie sichergestellt, dass dort keine Steuerzeichen drin sind.
Warum machst du nicht einfach sowas?
use File::Basename;
my $ID = $q->param("ID");
$ID =~ tr/A-Za-z_.-//dc;
$ID =~ s/\.\.//g;
my ($filename, $path, $suffix) = fileparse($q->param("upload"), qr/\.[^.]*/);
my $fname = $ID . time() . $suffix;
Wenn $ID
nummerisch sein muss, dann sogar besser prüfen, dass der Inhalt auch wirklich nummerisch ist.
while (read($handle,$buffer,2048)) { print FILE $buffer; } close (FILE);
Hier besser
use File::Copy;
copy($handle, "../../pics/$fname");
if ( ($type ne "image/jpeg") && ($type ne "image/png") && ($type ne "image/x-png") ) { print header('text/plain'); print"L-In Error :: falsches Dateiformat $type"; unlink("../../pics/$fname"); goto end; }
Lieber vor dem kopieren prüfen und gar nicht erst an den Zielort kopieren.
Der Rest sieht OK aus.
LG,
CK