Für all diejenigen die sich die FileReference Klasse bereits angesehen haben, wird es ab diesem Teil des Thread erst interessanter.
Sicherheitsaspekt Nr. 1:
Durch einen Kommentar in der MMNG bin ich auf ein Sicherheitsproblem im folgenden Bereich gestoßen.
public function browse():Void { var myFileExtension:Array = new Array({description:"Images", extension:"*.jpg"}); fileRef.browse(myFileExtension); }
Die Einschränkung der Dateiauswahl, so könnte man denken, sollte ausreichen um ein Upload z.B. von PHP-Scripten zu verhindern.
Das ist leider nicht ganz so einfach, da man mit einem kleinen Trick Dateien mit einer beliebigen Erweiterung hochladen kann.
Dazu nennt man das PHP-Script vor der Dateiauswahl zunächst einfach in das vorgegebene Format um. Das PHP-Script „upload.php“ wird also in „upload.jpg“ umbenannt. Nun öffnet man den Dateibrowser für die Auswahl der Datei und nennt die Datei im Dateibrowser wieder in „upload.php“ um. Nach Bestätigung wird das potenziell gefährliche PHP-Script hochgeladen.
Lösung Sicherheitsaspekt Nr. 1
Die Lösung für dieses Problem ist simpel. Die Dateierweiterung wird entweder in Flash oder serverseitig im PHP-Script nochmals überprüft. Zusätzlich bauen wir noch eine Dateigrößen-Abfrage ein. Dazu ändert man den Code, wie folgt:
... private var maxFileSize:Number = 200; public function MUploader(mc:MovieClip) { ... fileRefListener.onSelect = Delegate.createPacked(this,checkFileSize); ... } private function checkFileSize():Void { var myFileSize:Number = fileRef.size / 1024; if(myFileSize > maxFileSize) { status_txt.text = "Please reduce the filesize."; } else { checkFileExtension(); } } private function checkFileExtension():Void { // Extract Extension var firstPosition = fileRef.name.indexOf("."); var lastPosition = fileRef.name.indexOf(".",firstPosition+1); var myExtension:String = fileRef.name.substr(firstPosition+1).toLowerCase(); if(lastPosition != -1 || myExtension != "jpg") { status_txt.text = "Wrong File-Extension."; } else { // Call fileSelected fileSelected(); } } ...
Ok, das Problem wäre also gelöst. In der ersten Version des File-Uploads wurden einige Ereignisprozeduren ausgespart. Das möchte ich jetzt nachholen, da diese sehr nützlich sein können, wenn es mit dem Upload mal nicht so funktionieren sollte.
Die Ereignisprozeduren für Fehler beim Upload:
1. onHTTPError
Die Ereignisprozedur wird aufgerufen, wenn ein HTTP-Error auftritt, das kann z.B. ein Fehler mit dem Error-Code 403 (Forbidden), 404 (Not Found) oder 405(Method not allowed) sein. Ein paar weitergehende Infos über die Fehlermeldungen finden man hier. Für präzisere Beschreibungen, wäre ich dankbar.
2. onIOError
Diese Ereignisprozedur wird aufgerufen, wenn beim Lesen (Input) oder Schreiben (Output) ein Fehler auftritt. Das kann z.B. der Fall sein, wenn das Upload-Script in einem geschützen Bereich (htaccess) liegt.
3. onSecurityError
Die Ereignisprozedur wird aufgerufen, wenn ein Flashfilm auf einer anderen Domain auf den Flashfilm mit dem Upload zugreift.
Im folgenden werden die Ereignisprozeduren in die Upload-Anwendung aufgenommen. Dazu muß der Code, wie folgt geändert werden.
public function MUploader(mc:MovieClip) { .... fileRefListener = new Object(); fileRefListener.onHTTPError = Delegate.createPacked(this,showError,"http"); fileRefListener.onIOError = Delegate.createPacked(this,showError,"io"); fileRefListener.onSecurityError = Delegate.createPacked(this,showError,"security"); } private function showError(fileRef:FileReference,httpError:Object,errorType:String):Void { if(httpError) { httpError = String(httpError); status_txt.text = "Error: "+errorType +" - "+httpError; } else { status_txt.text = "Error: "+errorType; } }
Flash Upload – Version 2.1 Quelldateien herunterladen
Ok, soviel für heute.
In den nächsten Teilen widme ich mich einigen grundsätzlichen Problemen mit dem Upload, die ich selbst noch nicht (trotz langwieriger Recherche) lösen konnte. Weiterhin zeige ich, wie sich eine einfache Fortschrittanzeige und ein Batch-Upload realisieren lassen. Außerdem gehe ich auf einige zusätzliche Dateiabfragen (Sicherheit/PHP) ein.
Part III und Part IV is coming soon … stayed tuned.