Datei upload auf Server & Formularüberprüfung
bruzzler
- php
0 Auge0 hotti1 ACHTUNG Sicherheitslücke!
Tom0 Siri
Hi zusammen,
ich hänge gerade furchtbar in der Luft: ich habe ein formular, mit dem user eine Datei auswählen und diese dann auf unserem webserver speichern können.
Wenn allerdings bei der fehlerüberprüfung ein fehler aus einem anderen feld anschlägt (pflichfeld nicht ausgefüllt), so wird die bereits ausgewählte upload-datei gelöscht und muss neu ausgewählt werden.
Ist das möglich zu umgehen?
Danke und viele Grüße
Hallo
ich hänge gerade furchtbar in der Luft: ich habe ein formular, mit dem user eine Datei auswählen und diese dann auf unserem webserver speichern können.
Wenn allerdings bei der fehlerüberprüfung ein fehler aus einem anderen feld anschlägt (pflichfeld nicht ausgefüllt), so wird die bereits ausgewählte upload-datei gelöscht und muss neu ausgewählt werden.
Ist das möglich zu umgehen?
Natürlich ist es möglich das zu umgehen. Es liegt in deiner Hand, im PHP-Code, der die Eingaben auswertet, zu entscheiden, was in welchem Fehlerfall passieren soll. Du kannst z.B. die Prüfungen und vorgegebenen Aktionen für die einzelnen Eingaben sämtlichst durchgehen, ohne, dass das Ergebnis einer Prüfung die anderen Prüfungen beeinflusst. Du musst nur im Fehlerfall in einer Variable (Array) zwischenspeichern, dass ein Fehler aufgetreten ist. Zum Abschluss der Eingabeprüfungen schaust du im Fehlerarray nach, ob und wenn ja welche Fehler auftraten und reagierst nun darauf.
Hinterher hast du z.B. die Datei gespeichert, weist den Benutzer aber auf Fehler in der Eingabe eines anderen Feldes hin und bietest das Formular, mit den richtig ausgefüllten Feldern vorbelegt und den falsch ausgefüllten markiert, an (Suchbegriff: Affenformular).
Dazu ist es aber notwendig, den Benutzer identifizieren zu können. Ohne Identifizierung kannst du nach erneuter Eingabe eine schon im ersten Durchlauf gespeicherte Datei nicht mehr dem Benutzer zuordnen (Suchbegriffe: Session, Cookie).
Tschö, Auge
hi,
Wenn allerdings bei der fehlerüberprüfung ein fehler aus einem anderen feld anschlägt (pflichfeld nicht ausgefüllt), so wird die bereits ausgewählte upload-datei gelöscht und muss neu ausgewählt werden.
Also, Du meinst, dass dass File-Input-Feld im Browser leergemacht wird, ja, das wird es genau dann, wenn die Seite neu ausgeliefert wird, denn <input type="file">vorbelegen ist nicht möglich. Und hier haben wir die Lösung: Seite NICHT neu laden, auch nicht im Fehlerfall.
Ergo: Fehlerbehandlung mit JavaScript (Upload geht auch mit JS).
Horst
Hello,
erstmal zu Deiner Frage:
Session starten
Zuerst die anderen Felder prüfen lassen und in der Session eintragen
z.B. $_SESSION[$formname]['data'][$fieldname] = $value;
Erst, wenn alle Felder gecheckt sind, wird das File-Upload-Feld freigegeben.
Das Ganze fällt dann unter das Stichwort "Affenformular" (Goolge, SelfHTML-Archiv)
Aber viel wichtiger:
Wenn Du Dateien hochladen lässt, solltest Du das Verzeichnis, in dem die landen, keinesfalls innerhalb der Document-Root anordnen. Wenn sich das nicht vermeiden lässt, solltest Du die PHP-Engine für das Verzeichnis ausschalten!
### .htaccess
php_admin_value engine 0
Und außerdem sollten nur registierte User Dateien hochladen können. Du solltest registieren, wem welche Datei gehört. Das geht am besten in der Datenbank, in der auch die anderen Daten landen. Dort kann dann auch die Übersetzung des Filenamens (vom User) in den Ablagenamen (auf dem System) durchgeführt werden. Der muss ja UNIQUE ausgewürfelt werden, damit nicht neuere Dateien die vorhandenen ungewollt überschreiben.
Abe auch da solltest Du genau überlegen, welche MIME-Types du überhaupt von welchem User annehmen annehmen willst. Und sorge dafür, dass die .htaccess des Verzeichnisses nicht überschrieben werden kann oder eine hochgeladen werden kann
finfo funktioniert inzwischen einigermaßen. Und für Bilder tut es auch getimagesize().
Ich konnte nur noch keine Funktion endecken, die den MIME-Type in eine Dateiendung zurückverwandelt, um bei der späteren Ausgabe der Datei auch eine passende Endung mitliefern zu können. Der User kann ja alles behaupten beim Hochladen. Der in $_FILES gemeldete MIME-Type kann also locker gelogen sein, genauso, wie die Dateiendung.
Ich habe zu dem Thema mal einen Artikel im WIKI angefangen, der ist aber irgendwie verschollen...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
Wenn allerdings bei der fehlerüberprüfung ein fehler aus einem anderen feld anschlägt (pflichfeld nicht ausgefüllt), so wird die bereits ausgewählte upload-datei gelöscht und muss neu ausgewählt werden.
Ist das möglich zu umgehen?
Dann würde ich die Aufgabe aufsplitten:
1. Formular mit Eingabefeldern per AJAX zur Auswertung an den Server schicken
-> 1a Fehlermeldung und Felder markieren, zurück zu 1.
-> 1b Server meldet "OK", was dann zu
2. führt: Hochladen der Datei (Dateiupload-Feld in einem zweiten Formular) ausgelöst durch ein JS, dass den Response des Servers auswertet.
Damit sollte das Problem gelöst sein.
Viele Grüße
Siri