Ein paar Fragen zu Datei-Uploads
Luisa
- php
0 Alexander Foken0 Luisa
0 Andreas Korthaus0 Dieter Raber0 wahsaga
Einen wunderschönen guten Abend!
Ich habe folgende Probleme:
1. Wie prüfe ich, ob der Anwender einen gültigen Dateipfad im File-Feld angegeben hat? Ich bekomme, wenn ich z.B. "ABC" eingebe: Warning: getimagesize() [function.getimagesize]: Read error! ...
In der angegebenen Zeile steht: getimagesize($_FILES["datei"]["tmp_name"])
2. Kann ich die Breite des File-Feldes nicht ändern?
3. Wenn ich eine für die PHP-Einstellungen (upload_max_filesize) zu große Datei versuche upzuloaden, dann bekomme ich nach einer Weile die Fehlermeldung: Fatal error: Maximum execution time of 30 seconds exceeded ...
Wie kann ich das abfangen und sowas wie "Zu große Datei" ausgeben?
Ich danke euch vielmals!!!
Die Luisa :-)
Moin Moin !
- Wie prüfe ich, ob der Anwender einen gültigen Dateipfad im File-Feld angegeben hat? Ich bekomme, wenn ich z.B. "ABC" eingebe: Warning: getimagesize() [function.getimagesize]: Read error! ...
Gar nicht. Du prüft, ob der Anwender ein Bild mitgeschickt hat oder nicht. Hast Du multipart/mixed in deinem FORM-Tag stehen?
In der angegebenen Zeile steht: getimagesize($_FILES["datei"]["tmp_name"])
2. Kann ich die Breite des File-Feldes nicht ändern?
Du kannst es versuchen. Aber es steht dem Browser frei, Deine Angaben zu ignorieren.
- Wenn ich eine für die PHP-Einstellungen (upload_max_filesize) zu große Datei versuche upzuloaden, dann bekomme ich nach einer Weile die Fehlermeldung: Fatal error: Maximum execution time of 30 seconds exceeded ...
Dann rennt Dein Script wohl in eine Endlosschleife. So lange sollte ein Upload nicht dauern.
Wie kann ich das abfangen und sowas wie "Zu große Datei" ausgeben?
Abfangen kannst Du das nicht, denn in dem Moment, wo die Fehlermeldung kommt, hast Du keine Kontrolle mehr.
Du kannst überprüfen, ob der User einen Upload gemacht hat und ob der Upload Deinen Anforderungen (MIME Type, Dateigröße, Dateiinhalt) entspricht.
Alexander
Guten Abend!
Gar nicht. Du prüft, ob der Anwender ein Bild mitgeschickt hat oder nicht. Hast Du multipart/mixed in deinem FORM-Tag stehen?
Nein, multipart/form-data
Was ist der Unterschied?
Du kannst überprüfen, ob der User einen Upload gemacht hat und ob der Upload Deinen Anforderungen (MIME Type, Dateigröße, Dateiinhalt) entspricht.
Kann so eine Upload-Funktion denn gefährlich sein?
Im Moment prüfe ich durch:
$datei = getimagesize($_FILES["datei"]["tmp_name"]);
if ($foto[2]=="") { ...ABBRUCH... }
ob wirklich ein Bild hochgeladen wurde.
Ist das ausreichend?
Die Luisa :-)
Hio,
Gar nicht. Du prüft, ob der Anwender ein Bild mitgeschickt hat oder nicht. Hast Du multipart/mixed in deinem FORM-Tag stehen?
Nein, multipart/form-data
Was ist der Unterschied?
hm, multipart/mixed kenne ich nun auch nicht in Verbindung mit Formularen. Ka ob das dort überhaupt Sinn macht. Verwende multipart/form-data.
- Kann ich die Breite des File-Feldes nicht ändern?
beschränkt kannst du das. Mit
<input type="file" size="1" /> z.b. minimierst du die Breite so klein wie es geht. Ganz wegmachen lässt sich das nicht.
Du kannst überprüfen, ob der User einen Upload gemacht hat und ob der Upload Deinen Anforderungen (MIME Type, Dateigröße, Dateiinhalt) entspricht.
Kann so eine Upload-Funktion denn gefährlich sein?
ja, kann Sie. Weil du einem benutzer deiner Seite erlaubst eine Datei auf deinen Webspace hochzuladen. Wenn er nun die Möglichkeit hätte ausführbare Skripte dort reinzuladen und diese auch auszuführen, hätte er ziemlich viele Möglichkeiten. Stell dir mal vor was jemand machen kann wenn er ein PHP-Skript auf deinen Webspace einspielt ...
Im Moment prüfe ich durch:
$datei = getimagesize($_FILES["datei"]["tmp_name"]);
if ($foto[2]=="") { ...ABBRUCH... }
ob wirklich ein Bild hochgeladen wurde.Ist das ausreichend?
in welchem Zusammenhang steht $datei und $foto? Verstehe ich nicht so ganz.
Ausreichend ist sie eigentlich schon. Zumindest im Punkte Sicherheit, aber nicht optimal. Da getImageSize sicherlich mehr Formate unterstüzt als du verwendet möchtest.
Imho ist das ein Ansatzfehler. Verlasse dich nicht auf diese Funktion und nicht darauf welche Formate sie unterstüztz. Das könnte sich a.) verändern und b.) ist das sicherlich nie gleich den Formaten mit denen du arbeiten willst.
Über $_FILES["datei"]["type"] ist der bessere Weg. Dort kannst du dann nach image/gif, image/jpeg, imnage/pjpeg, image/png prüfen wenn du z.b GIF, JPEG und PNG verwenden möchtest.
gl & hf
Thorsten
Hallo!
Ich habe das jetzt geändert, nun überprüfe ich durch
if (@$datei = getimagesize($_FILES["datei"]["tmp_name"])) {
...
}
ob es sich um ein Foto handelt.
Über $_FILES["datei"]["type"] ist der bessere Weg. Dort kannst du dann nach image/gif, image/jpeg, imnage/pjpeg, image/png prüfen wenn du z.b GIF, JPEG und PNG verwenden möchtest.
Ich habe mal gelesen, dass die Übermittlung von Mime-Types sehr vom Browser abhängig ist. Ist meine obige Variante nicht besser, wenn ich alle Bilder zulassen möchte? Ich wäre dadurch auch gegen Uploads von Scripts und deren Ausführung geschützt, sehe ich das richtig?
Danke für deine Hilfe!
Die Luisa :-)
Hi!
Ich habe folgende Probleme:
- Wie prüfe ich, ob der Anwender einen gültigen Dateipfad im File-Feld angegeben hat? Ich bekomme, wenn ich z.B. "ABC" eingebe: Warning: getimagesize() [function.getimagesize]: Read error! ...
In der angegebenen Zeile steht: getimagesize($_FILES["datei"]["tmp_name"])
Du musst serverseitig prüfen, z.B. mit $_FILES["datei"]["error"] ob ein Fehler aufgetreten ist, getimagesize() ob es sich um ein Bild handelt... dass letzteres einen Fehler ausgibt ist doch völlig logisch, da keine Datei hochgeladen wurde.
- Kann ich die Breite des File-Feldes nicht ändern?
nein.
- Wenn ich eine für die PHP-Einstellungen (upload_max_filesize) zu große Datei versuche upzuloaden, dann bekomme ich nach einer Weile die Fehlermeldung: Fatal error: Maximum execution time of 30 seconds exceeded ...
Wie kann ich das abfangen und sowas wie "Zu große Datei" ausgeben?
Das Problem in diesem Fall ist nicht die Größenbeschränkung, sondern dass der Upload der großen Datei zu lange dauert(wenn die maximale Ausführungszeit auf 30 Sekunden begrenzt ist, schaffst Du mit einem Modem mit vielleicht 5 KB/Sek maximal eine 150 KB große Datei, bei schlechter Verbindung noch weniger!). PHP-Scripte sind meist in Ihrer Laufzeit beschränkt(max_execution_time). Das kann in der php.ini verändert werden. Weitere "Probleme" sind post_max_size, upload_max_filesize und andere. Solche Fehler abzufangen ist durchaus möglich, siehe dazu: http://www.php.net/manual/de/ref.errorfunc.php, ist aber nicht so einfach wie es sich jetzt vielleicht anhört.
Grüße
Andreas
Guten Abend!
Du musst serverseitig prüfen, z.B. mit $_FILES["datei"]["error"] ob ein Fehler aufgetreten ist, getimagesize() ob es sich um ein Bild handelt... dass letzteres einen Fehler ausgibt ist doch völlig logisch, da keine Datei hochgeladen wurde.
Mit $_FILES["datei"]["error"] hatte ich es schon probiert, echo $_FILES["datei"]["error"] gibt 0 aus -> kein Fehler. Wie lässt sich das erklären?
Das Problem in diesem Fall ist nicht die Größenbeschränkung, sondern dass der Upload der großen Datei zu lange dauert
Ich habe es bisher nur auf meinem heimischen PC getestet, da müsste das doch ratzfatz gehen!? ;)
Ist das immer so, dass bei zu großer Datei PHP keine entsprechende Fehlermeldung ausgibt, sondern einfach so lange ausführt, bis die Max-Zeit überschritten ist?
Die Luisa :-)
Hio,
Mit $_FILES["datei"]["error"] hatte ich es schon probiert, echo $_FILES["datei"]["error"] gibt 0 aus -> kein Fehler. Wie lässt sich das erklären?
wenn keine Datei vom Benutzer angegeben wurde, also keine Übertragen wurde, ist dies noch keine Fehler. Du kannst über $_FILES["datei"]["size"] prüfen ob eine Datei übertragen wurde.
Das Problem in diesem Fall ist nicht die Größenbeschränkung, sondern dass der Upload der großen Datei zu lange dauert
Ich habe es bisher nur auf meinem heimischen PC getestet, da müsste das doch ratzfatz gehen!? ;)
Ist das immer so, dass bei zu großer Datei PHP keine entsprechende Fehlermeldung ausgibt, sondern einfach so lange ausführt, bis die Max-Zeit überschritten ist?
Nein, normal ist das nicht. Auch wenn ich jetzt nicht 100% sicher bin, denke ich das liegt nicht direkt an der Grösse der Datei. Sondern dein Skript verursacht dann eine Endlosschleife wenn dieser Fall eintritt. Geh dein Skript einfach mla gedanklich durch für den Fall die Datei ist zu gross, vielleicht findest du dann eine Endlosschleife.
gl & hf
Thorsten
Nein, normal ist das nicht. Auch wenn ich jetzt nicht 100% sicher bin, denke ich das liegt nicht direkt an der Grösse der Datei. Sondern dein Skript verursacht dann eine Endlosschleife wenn dieser Fall eintritt. Geh dein Skript einfach mla gedanklich durch für den Fall die Datei ist zu gross, vielleicht findest du dann eine Endlosschleife.
Ich habe keine Endlosschleife finden können. Aber ich habe mal die max_execution_time und die max_input_time hochgestellt. Kann es sein, dass auf dem heimischen PC ein Upload mit einer bestimmten Geschwindigkeit (z.B. ISDN) simuliert wird?
Und nochwas:
Kann ich ein Bild automatisch verkleinern, in einen anderen Typ umwandeln, usw.?
Die Luisa :-)
Hallo!
Ich bin´s nochmal :-)
Ich habe noch eine Frage:
In der PHP-Dokumentation finde ich nur 4 Typen, die getimagesize() zurückgibt:
1 = GIF, 2 = JPG, 3 = PNG, SWF = 4
Wenn ich nun aber ein BMP hochlade, bekomme ich 6 zurück!
Hat sich das mittlerweile geändert?
Die Luisa :-)
Hallo Luisa,
Wenn ein File kein Image ist, returnt getimagesize false (guter deutscher Satz, was?)
Du koenntest also ein @ davorsetzen, um die Warnung zu unterdruecken und dann false/true mit if/else abfangen
Du kannst das File-Feld mit CSS formatieren, das meiste davon hat aber nur Auswirkungen im Internetexplorer, ausserdem wird das Attribut size unetstuetzt
Du kannst zb das Timelimit hochsetzen mit set_time_limit(50);
Es gibt da aber sicher bessere Moeglichkeiten, die leider nicht kenne.
Dieter
hi,
Wie kann ich das abfangen und sowas wie "Zu große Datei" ausgeben?
du könntest schon im <input>-tag das maxlength-attribut setzen.
beachtet jedoch die hinweise unter [1], was dessen zuverlässigkeit angeht; sowie die anderen bereits erfolgten hinweise zu deinem timeout-problem.
gruss,
wahsaga
[1] http://selfhtml.teamone.de/html/formulare/datei_upload.htm#definieren