Fragen zum Dateiup- und download mit PHP
Glory
- php
Hallo ihr :)
Ich programmieren gerade an einem Dateiupload Dienst. (bzw. eigentlich vorerst nur für Bilder)
Allerdings habe ich noch ein paar Designtechnische fragen.
1. möchte ich die Dateien nicht so gerne auf ihre Endung prüfen. Eine Blacklist wäre ziemlich unsicher und eine Whitelist schränkt zu sehr ein. Vor allem, wenn in Zukunft auch noch andere Dateien außer Bildern hochgeladen werden. Ich suche daher nach einem Weg, ein paar ausgewählte Dateitypen (.jpg .gif .png usw.) je nach Einstellung im Browser direkt anzeigen zu lassen, aber bei allen anderen Dateien den Download zu erzwingen. So können z.B. .php und .html Dateien hochgeladen werden, ohne dass damit Schaden angerichtet werden kann. Kann man das ganze für Verzeichnisse mittels .htaccess oder ähnlich lösen?
2. wie (un)sicher ist es, die Möglichkeit anzubieten, ein zip-Archiv hochladen zu lassen, welches dann entpackt wird und die Datein verarbeitet werden. Wie schwer ist es, soetwas zu realisieren?
Das war's (erstmal).
Freu mich auf eure Antworten.
Zu 1 :
Was du jetzt genau willst habe ich leider nicht verstanden. Was ich aber dazu zu sagen habe ist, dass ein Uplad von html bzw php definitiv ein hohes Risiko birgt.
Ausserdem finde ich, dass White-Lists für einen Datei-Upload die einzig wirklich akzeptable Lösung sind, da es schwer ist eine wirklich komplette Black-List zu erstellen (ausserdem geht es mit einer White-List schneller ;) )
- wie (un)sicher ist es, die Möglichkeit anzubieten, ein zip-Archiv hochladen zu lassen, welches dann entpackt wird und die Datein verarbeitet werden. Wie schwer ist es, soetwas zu realisieren?
Hmm es kann sehr unsicher sein, wenn du die Inhalte des Archives nicht prüfst. Am besten nimmst du dir eine White-List mit der du die Inhalte prüfst und nur die Dateien zulässt die du auch tatsächlich auf dem Server haben willst.
Besonders schwer wird das ganze nicht sein.
Gruß
Moe
Zu 1 :
Was du jetzt genau willst habe ich leider nicht verstanden. Was ich aber dazu zu sagen habe ist, dass ein Uplad von html bzw php definitiv ein hohes Risiko birgt.
Es ist allerdings nur ein Sicherheitsrisiko, wenn der Browser bzw. der Server die Datei parsed. Deswegen möchte ich ja, dass bei allen Dateien ein Download erzwungen wird. D.h., dass nicht die HTML Seite im Browser angezeigt wird, sondern ein Speicher-Dialog erzwungen wird. Mit der Ausnahme von Dateien wie .png, .jpg usw. (dafür erstelle ich dann eine Whitelist)
Der Vorteil daran ist, dass es keine Formateinschränkungen für den Uploader gibt.
Hmm es kann sehr unsicher sein, wenn du die Inhalte des Archives nicht prüfst. Am besten nimmst du dir eine White-List mit der du die Inhalte prüfst und nur die Dateien zulässt die du auch tatsächlich auf dem Server haben willst.
Besonders schwer wird das ganze nicht sein.
Gut, dann werde ich mich mal etwas näher erkundigen. Falls du gute Links zum Thema hast, nur her damit! :)
Zu 1 :
Was du jetzt genau willst habe ich leider nicht verstanden. Was ich aber dazu zu sagen habe ist, dass ein Uplad von html bzw php definitiv ein hohes Risiko birgt.Es ist allerdings nur ein Sicherheitsrisiko, wenn der Browser bzw. der Server die Datei parsed. Deswegen möchte ich ja, dass bei allen Dateien ein Download erzwungen wird. D.h., dass nicht die HTML Seite im Browser angezeigt wird, sondern ein Speicher-Dialog erzwungen wird. Mit der Ausnahme von Dateien wie .png, .jpg usw. (dafür erstelle ich dann eine Whitelist)
Hmm ich weiss nicht genau wie sicher das ganze ist, aber einen Upload von PHP/HTML Dateien zu erlauben würde ich mich persönlich nicht trauen :)
»»Falls du gute Links zum Thema hast, nur her damit! :)
Ich denke hier lässt sich schonmal einiges rausfinden ;)
http://de.php.net/manual/de/ref.zip.php
Hmm ich weiss nicht genau wie sicher das ganze ist, aber einen Upload von PHP/HTML Dateien zu erlauben würde ich mich persönlich nicht trauen :)
Mit folgendem Inhalt einer .htaccess, parsed der Server kein PHP (CGI) mehr. (Verzeichnisauflistung wird auch verhindert)
-------.htaccess-----------
php_flag engine off
Options -ExecCGI -Indexes
---------------------------
Das Problem ist nur, dass ich erstens von so einem "Serverzeugs" nur wenig Ahnung habe. D.h. es ist eine vielleicht unvollständige Blacklist. Daher würde ich eine allgemeine Lösung vorziehen, mit der halt alle Dateien (außer die, die ich angebe) geparsed werden und alle andere einfach an den Browser geschickt werden (am besten mit Download-Dialog).
- möchte ich die Dateien nicht so gerne auf ihre Endung prüfen. Eine Blacklist wäre ziemlich unsicher und eine Whitelist schränkt zu sehr ein. Vor allem, wenn in Zukunft auch noch andere Dateien außer Bildern hochgeladen werden. Ich suche daher nach einem Weg, ein paar ausgewählte Dateitypen (.jpg .gif .png usw.) je nach Einstellung im Browser direkt anzeigen zu lassen, aber bei allen anderen Dateien den Download zu erzwingen. So können z.B. .php und .html Dateien hochgeladen werden, ohne dass damit Schaden angerichtet werden kann. Kann man das ganze für Verzeichnisse mittels .htaccess oder ähnlich lösen?
Eine Datei auf ihre Endung zu prüfen macht auch wenig Sinn. Am besten du siehst dir den Mimie-Typen deiner Datei an. Dieser findet sich ohnehin in $_FILES['name']['type'] - sofern als image/jpeg, image/gif oder image/png enthalten sein sollen, kannst du das bereits hier überprüfen.
Ähnlich verhält es sich mit allen anderen Dateien. Das reien Ablegen von hochgeladenen Dateien halte ich für unbedenklich. Ich würde mir eine extra Datei schreiben, die mir die abgelegten Dateien ausliest und sie sozusagen zu Downloadzwecken "imitiert".
- wie (un)sicher ist es, die Möglichkeit anzubieten, ein zip-Archiv hochladen zu lassen, welches dann entpackt wird und die Datein verarbeitet werden. Wie schwer ist es, soetwas zu realisieren?
Halte ich für unbedenklich. Bin allerdings auch kein Spezialist. Wie schwer es zu realisieren ist, hängt von deinen Vorkentnissen ab. Da gibt es aber fertige Klassen.
Eine Datei auf ihre Endung zu prüfen macht auch wenig Sinn.
Warum? Ein Browser reagiert doch auf eine URL ja nach Dateiendung bzw. Header oder nicht? D.h. wenn ich www.beispiel.de/irgendwas.html habe, geht der Browser von einer HTML-Datei aus, bei .../irgendwas.jpg wird er aber von einem Bild ausgehen, es sei denn der Header sagt etwas anderes. Ist das nicht so? Für den Server sieht das natürlich wieder anders aus.
Am besten du siehst dir den Mimie-Typen deiner Datei an. Dieser findet sich ohnehin in $_FILES['name']['type'] - sofern als image/jpeg, image/gif oder image/png enthalten sein sollen, kannst du das bereits hier überprüfen.
Sind selbige nicht vom Browser übermittelt und somit fälschbar?
echo $begrüßung;
Eine Datei auf ihre Endung zu prüfen macht auch wenig Sinn.
Warum? Ein Browser reagiert doch auf eine URL ja nach Dateiendung bzw. Header oder nicht?
Ein Browser hat die Angabe im HTTP-Header Content-Type auszuwerten. Der Name einer URL ist vollkommen belanglos.
echo "$verabschiedung $name";
Warum? Ein Browser reagiert doch auf eine URL ja nach Dateiendung bzw. Header oder nicht? D.h. wenn ich www.beispiel.de/irgendwas.html habe, geht der Browser von einer HTML-Datei aus, bei .../irgendwas.jpg wird er aber von einem Bild ausgehen, es sei denn der Header sagt etwas anderes. Ist das nicht so? Für den Server sieht das natürlich wieder anders aus.
Ich kann auch ein Bild mittels .php ausgeben solange ich den Mime-Typen angebe.
Sind selbige nicht vom Browser übermittelt und somit fälschbar?
Sind sie, das weiß ich allerdings erst seit gerade eben ;)
echo $begrüßung;
Eine Datei auf ihre Endung zu prüfen macht auch wenig Sinn. Am besten du siehst dir den Mimie-Typen deiner Datei an. Dieser findet sich ohnehin in $_FILES['name']['type'] - sofern als image/jpeg, image/gif oder image/png enthalten sein sollen, kannst du das bereits hier überprüfen.
Diese Angabe kommt ebenso wie der Dateiname vom Client, kann also auch beliebig gefälscht sein. Eine Inhaltsprüfung auf dem Server ist unumgänglich, wenn man den wirklichen Dateityp wissen will. Für einige der Bildformate eignet sich getimagesize(). Ansonsten gibt es nicht viel mehr Möglichkeiten als die Fileinfo Functions.
echo "$verabschiedung $name";