Nicht immer ist es gewünscht, dass eine Datei direkt im Browser geöffnet wird. Gerade Bilder, HTML-Dokumente und auch PDFs werden aber automatisch im Webbrowser angezeigt. Mit einem Trick kann man sie als Download öffnen.

Eigentlich hat der liebe Gott Mime-Types kreiert um verschiedene Dateiformate durch den Browser richtig behandeln zu lassen. Unbekannte Formate und Binärformate werden vom Browser als Download angeboten.

Leider funktioniert der type Parameter bei Links nur bedingt. Der folgende Code <a href="/test.jpg" type="application/octet-stream">download</a> erzeugt einen Link auf ein Bild, das aber nicht (wie gefordert) als Binärdatei gespeichert, sondern im Browser angezeigt wird. Ursache dafür ist der Webserver, der für Bilder automatisch einen "image"-header sendet.

Lösung 1: Das Download Script

Mit php kann man sich ein kurzes Script basteln, dass die gewünschte Datei liest und als Binärdatei sendet.

Das folgende Programm würde beispielsweise so aufgerufen: (http://www.meinserver.de/force_download.php?file=test.jpg). Der Trick liegt hierbei im Mime-Type (application/force-download). Den Typ force-download gibt es nämlich nicht.


Dadurch wird der Webbrowser animiert die Datei als Download anzubieten. Die Lösung ist nicht ganz sauber, funktioniert aber mit allen Browsern. Auch unser Downloadscript aus dem Beitrag PHP Download-counter Scriptkann dadurch ergänzt werden.

Lösung 2: Umleitung mittels Htaccess

Eleganter ist es jedoch, wenn der Server Bilder, Dokumente oder PDFs aus einen bestimmten Verzeichnis einfach als binäre Anhänge sendet. Dazu benötigt man Zugriff auf .htaccess

Im Downloadverzeichniss wird folgende .htaccess Datei erstellt.

<FilesMatch "\.(?i:pdf|jpg|gif)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

 

Achtung: Nur im gewünschten Downloadverzeichnis ablegen!

 

Voraussetzung ist jedoch, dass Apache mod_headers aktiviert hat. Sonst kommt es zu einem 500er Serverfehler. Bei manchem Providern wie 1und1 kann man Module dynamisch in der .htacces Datei nachladen.

Bsp: LoadModule headers_module modules/mod_headers.so

 

Kommentare  

#4 Re: GROSSES Sicherheits-Loch 2012-08-15 09:36
Hallo Georg, Du hast sicher recht. Das ist ja nur ein kurzes Beispiel für die Verwendung von Headern. Im Beitrag "Download-count er Script" gibt es eine richtige Klasse für Filedownloads bei der der Filename gesäubert wird und Dateien nur aus einem fest definierten Verzeichnis geholt werden. Aber ich habe den code etwas geändert und den Filenamen gefiltert. $fn ame = preg_replace("/ [^0-9a-z.\-_ ]/i", "", strip_tags(trim ($_GET["file"]) )); Ist sicher auch nicht perfekt. Aber es hilft fürs erste.
Zitieren
#3 GROSSES Sicherheits-Loch 2012-08-15 01:49
Das PHP Script, so wie es ist, ist eins der größten Sicherheitslöch er, die ich je gesehen habe! Praktisch JEDE Datei kann damit vom Server geholt werden. Z.B. /etc/passwd und andere Server Konfig-Dateien, jede beliebige .htaccess/.htpa sswd Datei, jede *.php Datei (im Quelltext) und damit dann z.B. auch DB-Zugangsdaten usw. Der GET Parameter ($fname/$filena me) MUSS UNBEDINGT sorgfältigst geprüft werden. Nur ganz wenige bestimmte Datei-Endungen, keine absoluten Pfade, keine relativen, die mit '../' beginnen, am besten nur wenige ausdrücklich freigegebene relative Pfade!!!
Zitieren
#2 funktioniert 2012-07-06 19:40
Habe es als Post versandt! Und mit deiner Funktion gestartet. Geil!
Zitieren
#1 Fehler 500! 2012-05-28 14:36
Ich habe es mal ausprobiert, aber dann kam Serverfehler 500. Kannst du mir mal helfen???
Zitieren

Kommentar schreiben


Sicherheitscode
Aktualisieren