In meiner Webanwendung (asp.net, c #) lade ich eine Videodatei auf einer Seite hoch, möchte aber nur flv-Videos hochladen. Wie kann ich einschränken, wenn ich andere Erweiterungsvideos hochlade?
Auf diese Weise kann jemand eine beliebige Datei * .flv umbenennen und hochladen. Abhängig von Ihren Anforderungen möchten Sie möglicherweise auch den MIME-Typ überprüfen.
David Glenn
Wird der MIME-Typ normalerweise nicht entsprechend der Dateinamenerweiterung festgelegt?
Thilo
@Thilo, Sie haben Recht, aber die Erweiterung kann geändert werden, ohne den MIME-Inhaltstyp zu ändern. Der MIME-Typ beschreibt die in der Datei enthaltenen Daten, sodass sie angemessen behandelt werden können. Siehe en.wikipedia.org/wiki/MIME
Mark Dickinson
2
Nein, der bessere Weg ist, den Dateiinhalt zu überprüfen. Es ist notwendig, die flv-Signatur zu überprüfen.
Marat Faskhiev
Nur um dies zu ergänzen, da es immer noch eine beliebte Antwort ist - das Argument vom Typ MIME ist genauso unsicher wie die Erweiterung, da beide gefälscht werden können. Eine Kombination beider Überprüfungen ist wahrscheinlich eine vernünftige Lösung. Wenn jedoch die Sicherheit ein Problem darstellt, sollten strengere Überprüfungen durchgeführt werden, z. B. das Blockieren nicht signierter Dateien oder das Abtasten von Inhalten.
James
21
Sie können einfach den Stream einer Datei lesen
using (var target =newMemoryStream()){
postedFile.InputStream.CopyTo(target);vararray= target.ToArray();}
Die ersten 5/6-Indizes geben Auskunft über den Dateityp. Im Falle von FLV sind es 70, 76, 86, 1, 5 .
Dies sollte höher bewertet werden. Wenn Sie wirklich möchten, dass Ihre Anwendung funktioniert und die Daten nicht vertrauenswürdig sind, sollten Sie den Anfang überprüfen.
PRMan
7
Auf dem Server können Sie hier oder bei Google den MIME-Typ und den MIM-Typ nachschlagen.
Sie sollten überprüfen, ob der MIME-Typ ist
video/x-flv
Wenn Sie beispielsweise einen FileUpload in C # verwenden, können Sie dies tun
Wenn Sie eine haben FileInfo fi, können Sie außerdem einfach Folgendes tun:
string ext = fi.Extension;
und es wird die Erweiterung der Datei enthalten (Hinweis: Es wird die enthalten ., so dass ein Ergebnis der oben genannten sein könnte: .jpg.txtund so weiter ....
Sie können den Dateityp, den der Benutzer auf der Clientseite hochlädt, nicht einschränken [*]. Dies ist nur auf der Serverseite möglich. Wenn ein Benutzer eine falsche Datei hochlädt, können Sie dies erst erkennen, wenn die Datei hochgeladen wurde. Es gibt keine zuverlässige und sichere Möglichkeit, einen Benutzer daran zu hindern, das gewünschte Dateiformat hochzuladen.
[*] Ja, Sie können alle möglichen cleveren Dinge tun, um die Dateierweiterung zu erkennen, bevor Sie mit dem Hochladen beginnen, aber verlassen Sie sich nicht darauf. Jemand wird es umgehen und früher oder später hochladen, was er will.
Obwohl er einen Hacker nicht daran hindern kann, das hochzuladen, was er möchte, sollte er dies dennoch auf der Client-Seite überprüfen, um es dem Benutzer zu erleichtern. Flash-Uploader sollten in der Lage sein, den Dateityp zu überprüfen.
Thilo
1
Das OP erwähnte keine Flash-Uploader (dh "in Flash geschriebene Uploader" anstelle von "Uploadern von Flash-Inhalten"). Die Frage ist mit asp.net- und c # -Tags versehen, und bei diesen Technologieoptionen ist die clientseitige Überprüfung begrenzt und kann leicht besiegt werden. :)
ZombieSheep
Für eine Video-Upload-Site sollte er auf der Clientseite etwas Besseres haben als ein HTML-Upload-Formular. Multi-MB-Uploads ohne Fortschrittsbalken machen keinen Spaß.
Thilo
Ok, Sie sagen, dass die clientseitige Überprüfung nicht so gut ist. Wie kann ich die serverseitige Überprüfung einchecken
?
@Thilo - Ich könnte nicht mehr zustimmen, aber die Frage bezieht sich auf ein ASP.net-Upload-Formular. Es liegt an der OP, ob er das für gut genug hält oder nicht.
ZombieSheep
2
Sie können die FLV-Signatur überprüfen. Sie können die Spezifikation hier herunterladen:
Bei DotNetPerls wurde eine alternative Lösung gefunden , die mir besser gefallen hat, da Sie keinen Pfad angeben müssen. Hier ist ein Beispiel, in dem ich ein Array mithilfe einer benutzerdefinierten Methode gefüllt habe
// This custom method takes a path // and adds all files and folder names to the 'files' arraystring[] files =Utilities.FileList("C:\", "");// Then for each array item...foreach(string f in files){// Here is the important line I used to ommit .DLL files:if(!f.EndsWith(".dll",StringComparison.Ordinal))// then populated a listBox with the array contents
myListBox.Items.Add(f);}
Antworten:
Path.GetExtension
quelle
Sie können einfach den Stream einer Datei lesen
Die ersten 5/6-Indizes geben Auskunft über den Dateityp. Im Falle von FLV sind es 70, 76, 86, 1, 5 .
wenn
isAllowed
gleichtrue
dann sein FLV.ODER
Lesen Sie den Inhalt einer Datei
Die ersten zwei / drei Buchstaben geben den Dateityp an.
Im Falle von FLV ist es "FLV ......"
quelle
Auf dem Server können Sie hier oder bei Google den MIME-Typ und den MIM-Typ nachschlagen.
Sie sollten überprüfen, ob der MIME-Typ ist
Wenn Sie beispielsweise einen FileUpload in C # verwenden, können Sie dies tun
quelle
Ich bin mir nicht sicher, ob Sie das wollen, aber:
Oder:
quelle
Wenn Sie eine haben
FileInfo fi
, können Sie außerdem einfach Folgendes tun:und es wird die Erweiterung der Datei enthalten (Hinweis: Es wird die enthalten
.
, so dass ein Ergebnis der oben genannten sein könnte:.jpg
.txt
und so weiter ....quelle
Sie können den Dateityp, den der Benutzer auf der Clientseite hochlädt, nicht einschränken [*]. Dies ist nur auf der Serverseite möglich. Wenn ein Benutzer eine falsche Datei hochlädt, können Sie dies erst erkennen, wenn die Datei hochgeladen wurde. Es gibt keine zuverlässige und sichere Möglichkeit, einen Benutzer daran zu hindern, das gewünschte Dateiformat hochzuladen.
[*] Ja, Sie können alle möglichen cleveren Dinge tun, um die Dateierweiterung zu erkennen, bevor Sie mit dem Hochladen beginnen, aber verlassen Sie sich nicht darauf. Jemand wird es umgehen und früher oder später hochladen, was er will.
quelle
Sie können die FLV-Signatur überprüfen. Sie können die Spezifikation hier herunterladen:
http://www.adobe.com/devnet/flv/
Siehe Kapitel "Der FLV-Header".
quelle
Endet mit()
Bei DotNetPerls wurde eine alternative Lösung gefunden , die mir besser gefallen hat, da Sie keinen Pfad angeben müssen. Hier ist ein Beispiel, in dem ich ein Array mithilfe einer benutzerdefinierten Methode gefüllt habe
quelle
Die obige Methode funktioniert gut mit Firefox und IE. Ich kann alle Arten von Dateien wie zip, txt, xls, xlsx, doc, docx, jpg, png anzeigen
aber als ich versuche, die Dateierweiterung von googlechrome zu finden, bin ich gescheitert.
quelle
Es ist erwähnenswert, wie die Erweiterung auch parallel zum Abrufen der Erweiterung entfernt werden kann:
quelle
Diese Lösung hilft auch bei mehr als einer Erweiterung wie "Avishay.student.DB".
quelle