Readers: 3
|< 1 2 3 >| | 30 entries, 3 pages |
1
2
3
4
5
6
7
8
9
## Get Unique ID Passed from PHP
my $sid = (split(/[&=]/,$ENV{QUERY_STRING}))[1];
$sid =~ s/[^a-zA-Z0-9]//g;
## Define Directory Paths (Must be Absolute Paths)
my $upload_dir = $ENV{'DOCUMENT_ROOT'}."/upload_fraeszentrum/";
my $tmp_dir = $ENV{'DOCUMENT_ROOT'}."/tmp/";
my $session_dir = $tmp_dir.$sid;
my $upload_dir = $ENV{'DOCUMENT_ROOT'}."/upload_fraeszentrum/test/";
1
2
my $pfad = param('pfad');
my $upload_dir = $ENV{'DOCUMENT_ROOT'}."/upload_fraeszentrum/".$pfad."/";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
################################################################################
## Process Uploaded File
################################################################################
if(-d $session_dir){
my $query = new CGI;
my $file_name = $query->param("filename");
$file_name =~ s/.*[\/\\](.*)/$1/;
my $upload_file_path = $upload_dir.$file_name;
my $upload_filehandle = $query->upload("filename");
my $tmp_filename = $query->tmpFileName($upload_filehandle);
close($upload_filehandle);
print "Moving File to Upload Directory -> ";
if ( rename($tmp_filename, $upload_file_path) ) {
print "<b style='color:green;'>Success</b><br>";
} else {
print "<font color='red'>Failure</font><br>";
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
if(-d $session_dir){ my $query = new CGI; my $file_name = $query->param("filename"); $file_name = (split(/[\/\\]/,$file_name))[-1]; my $upload_file_path = $upload_dir.$file_name; my $upload_filehandle = $query->upload("filename"); print 'Moving File to Upload Directory -> '; my ($tmpfh2, $buffer); if ( open($tmpfh2, '>', $upload_file_path ) ) { flock($tmpfh2, LOCK_EX); while (my $bytesread = read($upload_filehandle, $buffer, 1024)) { print $tmpfh2 $buffer; } if( close($upload_filehandle) and close($tmpfh2) { print $query->b({-style=>'color:green'}, "Success"), $query->br(); } else { print $query->b({-style=>'color:red'}, "Failure"),$query->br(); } } else { print $query->b({-style=>'color:red'}, "Failure"),$query->br(); } }
Gast+2007-12-06 11:20:58--Code (perl): (dl )1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44use strict; use warnings; use CGI::Carp qw/fatalsToBrowser/; use CGI qw/:cgi/; # Schon hier oben muss CGI instanziert werden, weil es automatisch auch den # QureyString zerlegt. Siehe weiter unten. my $SID = "PHPSESSID"; # Hier dann Eintragen was die PHP Anwendnung verwendet. my $cgi = new CGI; ## Get Unique ID Passed from PHP # Also erst mal Directory Traversal Attacks abchecken !!! # Und natürlich auch im Dateinamen, weil ein Angreifer das in seinem # Tool dort geschickt einbaut. exit if ( $cgi->param($SID) =~ |/\.\./| or $cgi->param('filename') =~ |/\.\./| ); # Und aussteigen wenn das einer versucht, denn dann braucht Dein # Skript überhaupt nichts mehr machen. Solche Sachen am besten # gleich zu Anfang des Skriptes, noch vor den Variablen Insitialisierung. # Und den split hier kann man sich dann sparen, weil der die RegEx Engine # jetzt nochmal anwirft. # my $sid = (split(/[&=]/,$ENV{QUERY_STRING}))[1]; $cgi->param($SID) =~ s/[^a-zA-Z0-9]//g; ## Define Directory Paths (Must be Absolute Paths) # Stings nur dann contantenieren, wenn es sich überhaupt nicht vermeiden # lässt. Evaluieren muss Perl diese sowieso. my $upload_dir = "$ENV{DOCUMENT_ROOT}/upload_fraeszentrum/"; my $tmp_dir = "$ENV{DOCUMENT_ROOT}/cgi-bin/tmp/"; my $session_dir = $tmp_dir.$cgi->($SID); # Und das tmp würde ich im cgi-bin Verzeichnis anlegen, weil man daraus keine # statischen Inhalte abrufen kann. So kann da keiner einfach mal reinschnuppern. # Einer der Gründe warum ich CGI/Perl so liebe. Man braucht sich da keinen Kopf # um .htaccess und so 'ne Sachen machen :D
Und dann der eigentliche Upload.
Code (perl): (dl )1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50################################################################################ ## Process Uploaded File ################################################################################ if(-d $session_dir){ # Das hatten wir oben schon. # my $query = new CGI; my $file_name = $cgi->param("filename"); $file_name =~ s/.*[:\/\\](.*)/$1/; # Den Doppelpunkt für die Macs my $upload_file_path = $upload_dir.$file_name; my $upload_filehandle = $cgi->upload("filename"); my $tmp_filename = "upl_".$$.$file_name; # TemporärDatei mit der PID # close($upload_filehandle); use Fcntl qw/:flock/; # Fcntl auf flock begrenzen, das spart speicher, weil das eine # ausgewachsene Bibliothek ist, die wir nicht in voller Größe # brauchen. # Maximum Uploadgröße 2MB (oder bei bedarf mehr). $CGI::POST_MAX = 1024 * 2048; open F, ">", $tmp_filename || &err_msg ( $upl_err."<br>$!" ); # Mein ErrorHandler flock F, LOCK_EX; # Datei sperren. binmode $tmp_filename; # Zur Sicherheit in den Binärmodus schalten. binmode F; while ( read $tmp_filename, my $buf, 1024 ) { print F $buf; } flock F, LOCK_UN; # Datei wieder freigeben. close F; # Und ganz wichtig: Den Inhalt der hochgeladenen Datei abprüfen. # Entsprechend den Vorgaben, was da hochgeladen werden darf. unless ( &chk_filecontent($tmp_filename) ) { exit; } else { use File::Copy; print "Moving File to Upload Directory -> "; if ( move ( $tmp_filename, $upload_file_path ) ) { print "<b style='color:green;'>Success</b><br>"; } else { print "<font color='red'>Failure</font><br>"; } } # End unless chk_filecontent } # End if -d session_dir sub chk_fileconent { $file = shift || return; # Hier jetzt Pseudocode!!! return ($file eq "OK") ? 1 : 0; }
|< 1 2 3 >| | 30 entries, 3 pages |