|
Fileupload per Perl/CGIEine Datei soll über ein Formular und per HTTP auf einen Server geladen werden, da ein FTP-Zugang nicht zur Verfügung steht oder nicht eingesetzt werden soll. Für den Upload wird beim Formular die Codierung multipart/form-data verwendet, die es erlaubt, ein mehrteiligesFormular per POST-Methode zum Server zu senden. Der eine Teil sinddie normalen Formulareingaben, der andere Teil ist der Inhalt der hochgeladenenDatei. Selbst mehrere Dateien können so auf einmal hochgeladen werden.Auf den Server wird zunächst eine temporäre Datei angelegt, die dannvom CGI-Script verarbeitet werden muß. Das Formular hat zwei Eingabefelder,eines zur Auswahl der lokalen Datei und eines zur Angabe des Namens der Datei aufdem Server (letztere könnte auch aus dem Originalnamen abgeleitet oderautomatisch generiert werden):
<HTML><HEAD><TITLE>Upload</TITLE></HEAD><BODY><H1>Datei-Upload</H1><form action="/cgi-bin/upload.pl" method="post" enctype="multipart/form-data">Lokaler Dateiname: <input type="file" name="datei" size=40><BR>Dateiname auf dem Server: <input type="text" name="dateiname" size="40"><BR><input type="Submit" value="Upload"><input type="reset" value="Löschen"></form></BODY></HTML>
Betrachtet man sich das Formular mit dem Browser, sieht man einen Button "Browse"
neben der ersten Eingabezeile:
Durch den Eingabetyp "file" kann durch Anklicken des Buttons ein Fenster zum
Durchsuchen der Platte geöffnet werden wie man es von anderen Windows-Programmen
her kennt. Nach Eingabe der Daten und Anklicken des "Submit"-Buttons erfolgt der
Upload.
Der folgende Perl-Quellcode enthält ein Beispiel für ein Upload-Script.
Die Parameter stellen sowohl ein Filehandle, als auch den Dateinamen der
hochgeladenen Datei zur Verfügung.
In der while-Schleife wird die Datei in 1024 KByte großen
Blöcken eingelesen und in die angegebene Datei geschrieben. Beide sind im
Binär-Modus geöffnet, weil nicht bekannt ist, ob die Daten, die ankommen,
Binär- oder Text-Daten sind. Zuletzt wird noch eine Bestätigung an den
User zurückgegeben, daß die Datei erfolgreich gesichert wurde.
!/usr/bin/perl
# Einfaches Script fuer File-Upload
use strict;
use CGI qw(:standard);
# Upload Dir, kein Slash am Ende!
my $updir = "/home/httpd/htdocs/upload";
# Referer (mit .htaccess geschuetztes Verzeichnis wo das Formular liegt)
my $ref = "https://myhost.tld/upload/upload.html";
my $data; # Lesepuffer
##### BITTE BEACHTEN ######################################################
# Die Felder des Formulars
# <form action="/cgi-bin/ups.pl" method="post" enctype="multipart/form-data">
# Lokaler Dateiname:
# <input type="file" name="datei" size=40><BR>
# Dateiname auf dem Server:
# <input name="dateiname" size="40">
# <input type="Submit" value="Upload">
# <input type="reset" value="Löschen">
# </form>
print header;
print start_html('Datei-Upload');
if ($ENV{'HTTP_REFERER'} ne $ref)
{
print "<H1>Fehler!</H1>\n";
print "Es wurde versucht, ohne Erlaubnis hochzuladen! Abbruch...";
print $ENV{'HTTP_REFERER'};
print end_html;
exit;
}
my $datei = param('datei');
my $dateiname = param('dateiname');
if (! $datei or ! $dateiname)
{
print "<H1>Fehler!</H1>\n";
print "Datei oder Dateiname fehlt! Abbruch...";
print end_html;
exit;
}
if (! open WF, ">$updir/$dateiname")
{
print "<H1>Fehler!</H1>\n";
print "Datei kann nicht geschrieben werden! Abbruch...";
print end_html;
exit;
}
binmode $datei;
binmode WF;
while(read $datei,$data,1024)
{ print WF $data; }
close WF;
print "<H1>Upload O. K.</H1>\n";
print "Die Datei wurde hochgeladen.<BR>\n";
print "Remote Path and Filename: $updir/$dateiname\n";
print end_html;
exit;
Dieses Script ist nicht für den praktischen Gebrauch gedacht,
es dient lediglich als Beispiel. Sonst müssten die Sicherheits-Vorkehrungen
viel strenger sein.
Ein Datei-Upload auf den Server bedeutet immer ein Sicherheits-Risiko. Darum muß
die Datei auch in einem "harmlosen" Verzeichnis landen, keinesfalls in cgi-bin
Auch sollte man die Maximalgröße der Datei begrenzen, sonst fürt das
Hochladen riesiger Dateien zu einer Denial-of-Service-Situation.
Deshalb sollten von Anfang an einige Sicherheits-Vorkehrungen getroffen
werden. Dazu zählen unter anderem:
|
|
|