Flash 8 – Upload: Part II

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.
[code]public function browse():Void {
var myFileExtension:Array = new Array({description:“Images“, extension:“*.jpg“});
fileRef.browse(myFileExtension);
}[/code]

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.

Sicherheitsaspekt Nr. 1

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:

[code]

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();
}
}

[/code]

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.

[code]
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;
}
}
[/code]
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.

3 Gedanken zu „Flash 8 – Upload: Part II“

  1. Nice, diese Flash Upload Geschichten. Ich finde es lediglich nervig, dass man das Browse Fenster, also diese Explorer Ansicht, in der man die gewünschten Dateien auswählt, nicht vergrößern kann (oder habe ich was übersehen?).
    Ich erstelle nämlich derzeit eine Art Flash basiertes Video Editing System mit Filebrowser und allem drum und dran (hier ne *noch* hässliche beta: http://www.flickr.com/photos/marcelfahle/100725503/in/pool-screen_grab_confab_5/)
    in dem ich auch einen Filemanager integriert habe. Damit zu arbeiten ist schon anstrengend, wenn man in diesem Mickey-Mouse-Fenster 20 Dateien oder so auswählen muss..
    Na ja, nur ne Kleinigkeit, aber sehr störend…

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.