Fileupload - Bestimmung des Dateityps
Steffen Beyer
- perl
Hallo,
ich habe den Fileupload jetzt zwar hinbekommen, jetzt gibt es aber ein Problem! Wie erkenne/unterscheide ich die Dateitypen? Ich will meinen Usern nur gestatten Dateien im Format Gif oder JPG hochzuladen, das habe ich jetzt versucht wie folgt zu lösen:
Ich nutze die CGI.pm dafür...
Hier der Teil meines Scripts, der die Dateiendung feststellen soll:
if ($query->param("datei") =~ /gif|Gif|GIF/)
{ $dateiendung = "gif"; }
elsif ($query->param("datei") =~ /jpg|Jpg|JPG|jpeg|Jpeg|JPEG/)
{ $dateiendung = "jpg"; }
else
{
print "Ungültige Dateiendung!";
}
Leider klappt das irgendwie nicht so ganz. Wenn ich z.B. eine *.mov-Datei hochladen will, dann läd er ne halbe Ewigkeit und es passiert gar nix.
Bei kleinen Gif- bzw. Jpg-Dateien hingegen geht es...
Was ist falsch an meiner obigen Lösung. Wer kann mir helfen?
Danke
Steffen
Hi,
Wie erkenne/unterscheide ich die Dateitypen?
das sendende Betriebssystem kennt sowas nicht; bzw. zumindest wird diese Information nicht übermittelt. Du hast nur den Dateinamen - und die Datei selbst, welche Du gerne inhaltlich zu analysieren versuchen darfst.
if ($query->param("datei") =~ /gif|Gif|GIF/)
Du solltest
perldoc perlre
lesen. Dort erfährst Du etwas über "/i".
Leider klappt das irgendwie nicht so ganz. Wenn ich z.B. eine *.mov-Datei hochladen will, dann läd er ne halbe Ewigkeit und es passiert gar nix.
Und ohne die Prüfung auf Dateiendung geht es problemlos?
Bei kleinen Gif- bzw. Jpg-Dateien hingegen geht es...
Was passiert, wenn Du entweder eine kleinere *.mov oder eine größere *.gif/*.jp(e)g übermittelst?
Cheatah
Hallo Cheatah,
Wie erkenne/unterscheide ich die Dateitypen?
das sendende Betriebssystem kennt sowas nicht; bzw. zumindest wird diese Information nicht übermittelt. Du hast nur den Dateinamen - und die Datei selbst, welche Du gerne inhaltlich zu analysieren versuchen darfst.
if ($query->param("datei") =~ /gif|Gif|GIF/)
Du solltest
perldoc perlre
lesen. Dort erfährst Du etwas über "/i".
Gibt es da auch eine Adresse im Internet, wo ich das lesen kann?
Leider klappt das irgendwie nicht so ganz. Wenn ich z.B. eine *.mov-Datei hochladen will, dann läd er ne halbe Ewigkeit und es passiert gar nix.
Und ohne die Prüfung auf Dateiendung geht es problemlos?
Bei kleinen Gif- bzw. Jpg-Dateien hingegen geht es...
Was passiert, wenn Du entweder eine kleinere *.mov oder eine größere *.gif/*.jp(e)g übermittelst?
Dann meldet das Script, dass es entweder bei *.mov-Dateien eine Ungültige Dateiendung ist bzw. bei größeren Gif/JPG-Dateien braucht es auch ein wenig länger... aber da ich eh nur 20 KB erlauben will, wäre das nicht so das Problem.
Gruß
Steffen
Hi,
perldoc perlre
Gibt es da auch eine Adresse im Internet, wo ich das lesen kann?
bei größeren Gif/JPG-Dateien braucht es auch ein wenig länger...
Sind diese Dateien so groß wie die *.mov?
aber da ich eh nur 20 KB erlauben will, wäre das nicht so das Problem.
Doch, da die Daten auf jeden Fall vollständig übertragen werden. Je mehr Daten, umso länger dauert's.
Cheatah
Hi,
perldoc perlre
Gibt es da auch eine Adresse im Internet, wo ich das lesen kann?
bei größeren Gif/JPG-Dateien braucht es auch ein wenig länger...
Sind diese Dateien so groß wie die *.mov?
aber da ich eh nur 20 KB erlauben will, wäre das nicht so das Problem.
Doch, da die Daten auf jeden Fall vollständig übertragen werden. Je mehr Daten, umso länger dauert's.
Hmm... weißt Du vielleicht da eine Lösung meines Problems?
Gruß
Steffen
Hi,
Hmm... weißt Du vielleicht da eine Lösung meines Problems?
klar: Schreibe eine Serversoftware, die während der Übertragung der Daten bei Erreichen einer bestimmten Menge die Verbindung unterbricht.
Ohne Informatikstudium und jahrelange Arbeit mit einem entsprechend großen Etat: nein, da fällt mir nichts ein. Außer vielleicht, einen Server mit größerer Bandbreite zu mieten, der die Daten schneller empfängt; und/oder das Gesamtsystem zu optimieren.
Cheatah
Hi Cheatah!
Da Du dich mit sowas natürlich SEHR viel besser auskennst als ich, gehe ich davon aus, dass das nicht so einfach ist, wie ich denke: Wenn man eine Datei hochläd, hat man doch eine Variable z.B. mit dem Namen "Datei", und im Wert steht z.B. "Bild.jpg", richtig?
Jedenfalls überlege ich, ob man nicht einfach überprüfen kann(if...else... Fehlermeldung), ob im Wert der Variable Datei entweder ".gif" oder ".jpg" vorkommt. Bei meinem DB-Script wird auch geprüft, ob der Wer ein "," enthält, was dann autotmatisch in einen "." umgewandelt wird. Das ist doch vergleichbar, oder?
Aber da wärst Du wahrscheinlich schon selbst drauf gekomen, wenn das so möglich wäre:-)
Gruß
Alexander
Hi,
Wenn man eine Datei hochläd, hat man doch eine Variable z.B. mit dem Namen "Datei", und im Wert steht z.B. "Bild.jpg", richtig?
ja, im großen und ganzen. Den Dateinamen des benutzerlokalen Rechners erfährst Du.
Jedenfalls überlege ich, ob man nicht einfach überprüfen kann(if...else... Fehlermeldung), ob im Wert der Variable Datei entweder ".gif" oder ".jpg" vorkommt.
Klar, das ist kein Problem - und bringt Dir trotzdem nichts. Es hindert mich niemand dran, meinen frisch programmierten Virus in "nackte-Frau.gif" umzubenennen und hochzuladen - und wenn jemand dann mit einem HTTP-untauglichen Programm wie dem IE die Ressource anfordert, besteht akute Gefahr der direkten Ausführung, wodurch der Virus schnell verbreitet werden kann.
Bei meinem DB-Script wird auch geprüft, ob der Wer ein "," enthält, was dann autotmatisch in einen "." umgewandelt wird. Das ist doch vergleichbar, oder?
Klar - nur wäre die richtige Analogie nicht, den Dateinamen zu überprüfen, sondern den Datei_inhalt_! Checke die Binärdaten darauf, ob sie den GIF- oder JPEG-Spezifikationen entsprechen. In dem Fall dürfen sie auch "virus.exe" heißen, ohne daß irgendeine Gefahr besteht.
Leider kann ich Dir nicht das Modul Image::Size als "schnelle Möglichkeit" empfehlen, weil ich nicht weiß, wie dieses arbeitet. Möglicherweise liest es nur ein paar Bytes aus, die z.B. bei GIF (dort ist die Position innerhalb der Datei fest) die Größe in Pixeln repräsentieren. In dem Fall wären die Werte auch bei einer EXE evtl. sinnvoll...
Cheatah
Hallo!
Eine Frage: Welcher Virus kann denn mit ner gif-Endung Schaden anrichten, höchstens sowas wie pamela.gif.exe, oder?
Stimmt, ich war von meinem Anwendungsfall ausgegangen, das Mitarbeiter (obwohl man auch nicht immer allen trauen kann:-) die Dateien passend zu DB Einträgen hochladen - halt ohne FTP.
Hatte über Dein beschriebens Problem gar nicht nachgedacht!
Aber da dieses Script nur für ein paar Handverlesene Mitarbeiter zugänglich ist, sehe ich da kein Problem und verzichte erstmal noch auf mein Informatik-Studium :-)
Gruß
Alex
Noch ein kurzer Gedanke:
Kann man nicht mit if.... ausführbare Dateiendungen wie .exe etc. ausschließen? Dann verhindert man zumindest das gröbste, ich zumindestwüßte dann nicht mehr, wie ich noch einen Virus hochladen könnte. Aber mal was ganz anderes, wen ich als bösartiger Mensch mir z.B. ein kpl. PHP Script, welches doch einsehbar ist (oder?) kopiert und woanders installiert, die Befehle rausnimmt, kann er dann nicht munter raufladen, was ihm passt?
Oder war das wieder ein grober Denkfehler???Ich weiß, es ging um PERL, aber das ginge ja auch mit PHP.
Gruß
Alexander
Hi,
Eine Frage: Welcher Virus kann denn mit ner gif-Endung Schaden anrichten, höchstens sowas wie pamela.gif.exe, oder?
der IE - ein leider weit verbreitetes Produkt - ignoriert den HTTP-Standard und verwendet Ressourcen aufgrund dessen, was er aus den Daten herausanalysieren kann. Ohne weiteres ist es denkbar, daß er eine auf ".gif" endende Ressource ausführt, wenn er die Daten für ausführbar hält.
Kann man nicht mit if.... ausführbare Dateiendungen wie .exe etc. ausschließen?
Es gibt keine "ausführbaren Dateiendungen" - denn in HTTP gibt es sowas komisches wie Dateiendungen gar nicht. Um was für eine Art Ressource es sich handelt, sagt _ausschließlich_ der Content-Type, der Dir vom Client leider nicht mitgeteilt wird. Wenn Du den Server die Ressourcen ausliefern läßt, kannst Du den Content-Type so schreiben, wie Du möchtest - also z.B. eine als .gif benannte .exe als text/plain ausliefern.
Das Problem bei der gesamten Geschichte ist _nur_ der IE, der sich leider nicht an die technischen Standards hält, und dessen Verhalten gelinde gesagt unvorhersehbar ist. Wenn Du im Intranet arbeitest und garantieren kannst, daß der IE nicht verwendet wird, bist Du in Deiner Handlungsweise vollkommen frei, weil Du sehr leicht ein absolut ausreichendes Sicherheitskonzept erstellen kannst.
ein kpl. PHP Script, welches doch einsehbar ist (oder?)
Nicht, wenn Du es von einem auf PHP konfigurierten HTTP-Server anfragst.
kopiert und woanders installiert, die Befehle rausnimmt, kann er dann nicht munter raufladen, was ihm passt?
Also, es fängt wohl schon damit an, daß er an das Script nicht ran kommt. Dann kann er es nicht einfach auf den Server schmeißen - zumindest nicht, wenn Du minimale Sicherheit walten läßt, also die hochgeladenen Ressourcen _nur_ mit definierten Content-Types auslieferst, und zwar _ohne_ sie auf welche Weise auch immer ausführen zu lassen.
Ich weiß, es ging um PERL, aber das ginge ja auch mit PHP.
Mit einem CGI-Script ist es nicht anders.
Cheatah
Hallo!
Danke für die ausführliche Beantwortung!
Kleiner Denkfehler von mir mit dem php - da ich da noch nicht viel mache, kenne ich bis jetzt hauptsächlich scripte, die in html integriert werden.
Gruß
Alexander
Hi!
Überlege auch sowas zu realisieren, hab da bis jetzt nur was mit PHP zu gefunden. Hast Du evtl eine Quelle für mich, wo ich mir mal angucken kann, wie sowas in PERL funktioniert?
Gruß
Alex
Hi,
Hast Du evtl eine Quelle für mich, wo ich mir mal angucken kann, wie sowas in PERL funktioniert?
perldoc CGI
Cheatah