mod_rewrite in Abhängigkeit von Dateiendung

Alles, was den Apache betrifft, kann hier besprochen werden.

mod_rewrite in Abhängigkeit von Dateiendung

Postby erdling0815 » 14. January 2013 18:41

Hallo,

ich sitze bei einem Problem, bei dem ich irgendwie nicht weiterkomme. Ich habe ein Verzeichnis, in das User Dateien uploaden können. Nun besteht natürlich die Gefahr, dass Skripte wie PHP und Co hochgeladen werden, die dann in der Folge auf dem Server ausführbar sind.

Um das zu umgehen war meine Idee bestimmte Dateitypen festzulegen, die immer einfach downloadbar sind. Dazu gehören z.B. Grafiken, PDFs usw. Für diese Dateien, die ich also dann definiere, so viele sind es nicht, greift somit auch das ganze Apache Caching usw.

Für alle anderen Dateien möchte ich diesen Aufruf gerne an eine PHP Datei übergeben. Diese PHP Datei holt sich dann mittels readfile() den Content und sendet dieses einfach an den Browser. Damit lasse ich prinzipiell auch neue und in der Erlaubt-Liste nicht enthaltene Dateitypen zu, laufe aber nicht Gefahr, dass irgendwelche Skripte ausgeführt werden.

Soweit der Plan, nur bekomme ich die RewriteRule bzw. RewriteCond dazu nicht hin. Auch Google gab dazu nichts passendes her. Hat jemand dazu evtl. das passende Stück für die htaccess parat? Ich bin für jede Hilfe dankbar!

Viele Grüße,
Guido
erdling0815
 
Posts: 6
Joined: 10. February 2011 17:32

Re: mod_rewrite in Abhängigkeit von Dateiendung

Postby Nobbie » 14. January 2013 23:36

erdling0815 wrote:Um das zu umgehen war meine Idee bestimmte Dateitypen festzulegen, die immer einfach downloadbar sind. Dazu gehören z.B. Grafiken, PDFs usw. Für diese Dateien, die ich also dann definiere, so viele sind es nicht, greift somit auch das ganze Apache Caching usw.


Ne, das ist alles nur Herumgegurke und meilenweit von einer simplen Lösung entfernt. Die Aufgabenstellung lautet doch einfach nur: die Ausführung von PHP Scripten mit .htaccess verhindern. Dazu gibt es Millionen Google Treffer, eine von sehr vielen schlichten Lösungen will ich dennoch direkt hier verlinken:

http://fastwp.de/snippets/sicherheit-ph ... erhindern/
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: mod_rewrite in Abhängigkeit von Dateiendung

Postby erdling0815 » 15. January 2013 10:08

Nobbie wrote: die Ausführung von PHP Scripten mit .htaccess verhindern.


Nun ja, ich hatte ja beschrieben, dass ich nicht nur PHP Skripte verhindern will. Ich möchte eher ein Opt-In haben, bei dem ich genau definiere was erlaubt ist. Alles andere schicke ich noch mal durch eine Fallback-Lösung. Das ist deutlich unabhängiger davon, wie mein Server gerade konfiguriert ist, welche Endungen und Dateitypen welchen Handler zugeordnet sind usw.
erdling0815
 
Posts: 6
Joined: 10. February 2011 17:32

Re: mod_rewrite in Abhängigkeit von Dateiendung

Postby WilliL » 15. January 2013 10:59

verstehe ich dich richtig, dass du nach Abängigkeit vom Dateityp (Endung) folgendes erreichen willst:
a) ist in Whitelist (in htaccess definiert) => DL erlauben
b) wenn nicht, soll .htaccess an deinen php-Parser weiter leiten?
Willi
WilliL
 
Posts: 660
Joined: 08. January 2010 10:54
Operating System: Win7Home Prem 64 SP1

Re: mod_rewrite in Abhängigkeit von Dateiendung

Postby erdling0815 » 15. January 2013 11:05

WilliL wrote:verstehe ich dich richtig, dass du nach Abängigkeit vom Dateityp (Endung) folgendes erreichen willst:
a) ist in Whitelist (in htaccess definiert) => DL erlauben
b) wenn nicht, soll .htaccess an deinen php-Parser weiter leiten?


a) Korrekt. Wird also normal von Apache als Aufruf behandelt.
b) Alles andere wird an eine PHP Datei geleitet mit der angefragten Datei als Request-Parameter.
erdling0815
 
Posts: 6
Joined: 10. February 2011 17:32

Re: mod_rewrite in Abhängigkeit von Dateiendung

Postby WilliL » 15. January 2013 11:19

dann würde ich dem User ein uploadscript.php zur Verfügungstellen und dorthin die weitere Vorgehensweise auslagern.
Willi
WilliL
 
Posts: 660
Joined: 08. January 2010 10:54
Operating System: Win7Home Prem 64 SP1

Re: mod_rewrite in Abhängigkeit von Dateiendung

Postby erdling0815 » 15. January 2013 11:32

WilliL wrote:dann würde ich dem User ein uploadscript.php zur Verfügungstellen und dorthin die weitere Vorgehensweise auslagern.


Genau das will ich ja nicht. Dann müsste ich in PHP wieder die Apache Config auslesen, um dann z.B. das Caching und die weitere Config des Apache in PHP nachzubilden. Sprich, ich muss dann alle HTTP Header in PHP in Abhängigkeit des Dateityps jeweils neu zusammenbasteln.
erdling0815
 
Posts: 6
Joined: 10. February 2011 17:32

Re: mod_rewrite in Abhängigkeit von Dateiendung

Postby erdling0815 » 15. January 2013 16:23

Für alle die das Snippet evtl. auch mal gebrauchen können hier die Lösung. Ich finde es recht praktisch, da wie gesagt bei allen "normalen Dateien" die globale Apache Config greift und der ganze Rest trotzdem noch per Default funktioniert, nur eben keinen Schaden mehr anrichtet.

In der htaccess
Code: Select all
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^(.+)\.jpg$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.jpeg$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.gif$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.png$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.bmp$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.doc$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.docx$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.odt$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.pdf$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.html$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.htm$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.mht$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.txt$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.csv$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.xls$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.xlsx$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.pps$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.ppt$ [NC]
RewriteCond %{REQUEST_FILENAME} !^(.+)\.pptx$ [NC]
RewriteCond %{REQUEST_FILENAME} !/data/__downl.php$ [NC]
RewriteRule ^(.+)$ /data/__downl.php [NC,L]


und die __downl.php dann einfach
Code: Select all
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_SERVER['DOCUMENT_ROOT'].$_SERVER['REDIRECT_URL']);

header('Content-type: '.$mime);
readfile($_SERVER['DOCUMENT_ROOT'].$_SERVER['REDIRECT_URL']);
erdling0815
 
Posts: 6
Joined: 10. February 2011 17:32


Return to Apache

Who is online

Users browsing this forum: No registered users and 21 guests