RE: Dateien vor direktem Zugriff schützen
Hallo, Es ist ja auch normalerweise nicht der Sinn von einer Scriptsprache als Proxy zu arbeiten. trotzdem macht es keinen wirklichen Sinn das der Apache: - sich überhaupt den RAM damit vollhaut - und wenn überhaupt er es dann nicht wieder freigibt Wenn der Apache eine Datei direkt ausliefert macht er so späße ja auch nicht. Wenn man die Datei via PHP ausliefert und vor allem die Daten auch direkt zum Client gehen also nicht erst komplett zwischengepuffert werden macht es überhaupt keinen Sinn den ganzen Ausgabestrom parallel nochmal in den RAM zu puffern. Witzig vor allem ist das das ganze nur unter Linux/Prefork so läuft. Auf einem Win32/MPM System läuft das ganze wunderbar stabil ohne sinnloses RAM zumüllen etc. Gruß, Andreas -- Apache HTTP Server Mailing List users-de unsubscribe-Anfragen an [EMAIL PROTECTED] sonstige Anfragen an [EMAIL PROTECTED] --
RE: Dateien vor direktem Zugriff schützen
Hallo Paul, Bitte oben in der Mail nicht das xyz schrieb am ... entfernen, zumindest wenn noch Teile der Quotings vorhanden sind. tjo du ich entferne da nichts denn mein Mailprogramm macht sowas nicht. Wozu auch ? Dazu gibt es Message-ID und References im Mail-Header die von jedem gescheiten Mailprogramm richtig versorgt werden um eine hierarchisch Threadansicht zu erzeugen. Gruß, Andreas -- Apache HTTP Server Mailing List users-de unsubscribe-Anfragen an [EMAIL PROTECTED] sonstige Anfragen an [EMAIL PROTECTED] --
Re: Dateien vor direktem Zugriff schützen
Im Grunde kannst Du die Abfrage auch ohne eigentliche .htaccess Dateien lösen. ?php //php5 Anpassung $PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; $PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; // $users = array( user=passwort, anonyme=devine ); $auth_text = Du darfst hier nicht rein!; if(!(empty($PHP_AUTH_USER) || empty($PHP_AUTH_PW)) $PHP_AUTH_PW==$users[$PHP_AUTH_USER]){ include(page.php); } else{ header(www-authenticate: basic realm=\$auth_text\); header(http/1.0 401 unauthorized); } ? page.php kann ja die Seite sein, auf der die Links sind / die das Verzeichnis ausliest. Natürlich wäre auch ein Ausliefern unter falschen Namen möglich ?php // Wir werden eine PDF Datei ausgeben header(Content-type: application/pdf); // Es wird downloaded.pdf benannt header(Content-Disposition: attachment; filename=downloaded.pdf); // Die originale PDF Datei heißt original.pdf readfile('original.pdf'); ? Gruß Mario On 7/18/06, Andreas Müller [EMAIL PROTECTED] wrote: Hallo zusammen, ich such nach einer Lösung für folgendes Problem: Ich muss recht viele und auch z.T. recht große Dateien ausliefern. Das ganze in einem mit .htaccess/.htpasswd geschütztem Verzeichnis. Nun soll aber auch überwacht werden welcher Benutzer wann welche Datei herunterläd und ggf. soll das auch abgelehnt werden. Also liefert heute ein PHP Script die Daten aus und führt die Überwachung durch. http://domain.tld/user/download/film1.mpg wird per RewriteRule auf http://domain.tld/user/download/download.php?film1.mpg via [N,R] umgeleitet. Das funktioniert an sich soweit hat aber den Nachteil das der Apache dadurch massig Speicherplatz frisst da er scheinbar erstmal alles den RAM zieht. Das ist auch nur durch kurze Lebensdauer der Prozesse in den Griff zu bekommen sodas der Speicher halt schnell wieder freigegeben wird. Nun hatte ich die Idee das das PHP Script ja lediglich die Überwachung machen müsste und bei Erfolg eine Weiterleitung veranlassen könnte z.B. auf http://domain.tld/user/download/data/film1.mpg data ist ein Verzeichnis in der Document Root das per DenyAll jeglichen direkten Zugriff verwehrt. Nun die eigentlich frage: Kann man das so einrichten das man via speziellem rewrite im Apache Daten aus einem Verzeichnis ausliefert das normal per URL von aussen nicht ansprechbar ist? Ich will so verhindern das man bei Kenntniss der direkten URL von aussen die Daten unter Umgehung des PHP Scripts die Daten einfach abrufen kann. Gruß, Andreas -- Apache HTTP Server Mailing List users-de unsubscribe-Anfragen an [EMAIL PROTECTED] sonstige Anfragen an [EMAIL PROTECTED] -- -- Apache HTTP Server Mailing List users-de unsubscribe-Anfragen an [EMAIL PROTECTED] sonstige Anfragen an [EMAIL PROTECTED] --
RE: Dateien vor direktem Zugriff schützen
Hallo Mario, wie ich deiner Mail entnehmen kann hast du das Problem nicht verstanden. Das was du beschreibst ist nicht der Punkt. Dein Download-Script hat genau das Problem das sich der Apache dabei den RAM vollhaut - und genau das will ich nicht. D.h. nicht PHP muss die Daten ausliefern sondern der Apache soll dies direkt mit eigenen Mitteln tun. Denn nur so habe ich die Hoffnung das sich der Speicherverbrauch in Grenzen hält. Und genau dabei will ich das der eigentliche Speicherungsort nicht direkt aufrufbar ist z.B. (alle Angaben absolut zur Document Root !) - Daten liegen in /data - Browser ruft URL /user/download/film1.mpg auf und Datei /data/film1.mpg wird ausgeliefert - Browser ruft URL /data/film1.mpg auf - access denied Das ist das Ziel :-) Gruß, Andreas -- Apache HTTP Server Mailing List users-de unsubscribe-Anfragen an [EMAIL PROTECTED] sonstige Anfragen an [EMAIL PROTECTED] --
Re: Dateien vor direktem Zugriff schützen
Ok, ich gebe mich geschlagen! In einer anderen mail ging es doch auch um rewriteting # aendert das Ziel, Im Browser bleibt aber die alte URI erhalten # interne Umschreibung RewriteCond %{REQUEST_URI} ^/user/download/ RewriteRule ^/user/download/(.*)$ /data/$1 [PT] Vielleicht hilft das jetzt ja. Gruß Mario -- Apache HTTP Server Mailing List users-de unsubscribe-Anfragen an [EMAIL PROTECTED] sonstige Anfragen an [EMAIL PROTECTED] --
Re: Dateien vor direktem Zugriff schützen
Hallo Andreas, ich zitiere einen Kommentar von Rob Funk im PHP-Manual von readfile() http://php.cgerharz.de/readfile: When using readfile() with very large files, it's possible to run into problems due to the memory_limit setting; apparently readfile() pulls the whole file into memory at once. One solution is to make sure memory_limit is larger than the largest file you'll use with readfile(). A better solution is to write a chunking readfile. Here's a simple one that doesn't exactly conform to the API, but is close enough for most purposes: ?php function readfile_chunked ($filename) { $chunksize = 1*(1024*1024); // how many bytes per chunk $buffer = ''; $handle = fopen($filename, 'rb'); if ($handle === false) { return false; } while (!feof($handle)) { $buffer = fread($handle, $chunksize); print $buffer; } return fclose($handle); } ? Hoffe, ich konnte dir helfen. Viele Gruesse, Chris -- Apache HTTP Server Mailing List users-de unsubscribe-Anfragen an [EMAIL PROTECTED] sonstige Anfragen an [EMAIL PROTECTED] --
RE: Dateien vor direktem Zugriff schützen
Hallo Andreas, folgende Lösung könnte Dir bei Deinem Problem weiterhelfen: 1. Lege die herunterzuladenden Dateien in einem nicht für die Öffentlichkeit erreichbaren Verzeichnis ab. 2. Lege ein neues Verzeichnis download an, welches von extern über den Apache erreichbar ist. Das Verzeichnis bleibt zunächst leer. 3. Der User ruft zum Download ein PHP-/Perl-/Java-Programm auf, welches überprüft, ob der Download für den aufrufenden User und die gewünschte Datei freigeschaltet werden kann (z.B. Hat User bezahlt?, Sessionvariablen auslesen, etc.). Wenn der Download freigegeben werden kann, dann legt das PHP-/Perl-/Java-Programm für jede freigeschaltete Datei einen symbolischen Link in dem Verzeichnis download an. Die Namen der symbolischen Links kannst Du nach eigener Logik verschlüsseln und dafür sorgen, dass sie eindeutig sind. Dem User zeigst Du die Namen der generierten Links an und speicherst sie ggf. noch in Deiner Datenbank, falls Du dem User anbieten möchtest, dass er mehrere Stunden/Tage auf den Download zurückgreifen kann und er in seinem Kundenkonto/Profil für diese Zeit immer wieder auf die Downloadlinks zurückgreifen können soll. 4. Ein regelmäßiger Cron-Job löscht jede Minute symbolische Links im download-Verzeichnis, die mindestens n Stunden/ Tage alt sind. Das PHP-/Perl-/Java-Programm hat also nur die Aufgabe einen dynamischen Link anzulegen und liefert die Dateien nicht aus. Der PHP-Befehl zum Anlegen von symbolischen Links lautet symlink (vgl. http://de.php.net/manual/de/function.symlink.php). Du mußt in Deiner Apache-Konfiguration dafür sorgen, dass Options FollowSymLinks für das Verzeichnis download gesetzt ist (vgl. http://httpd.apache.org/docs/2.0/mod/core.html#options). Achte weiterhin peinlichst auf korrekte Schreibrechte und Eigentumsverhältnisse auf Verzeichnis- und Dateiebene. Gruß Marcus Reimann M. Reimann Systemberatung http://www.reimann-systemberatung.de -- Apache HTTP Server Mailing List users-de unsubscribe-Anfragen an [EMAIL PROTECTED] sonstige Anfragen an [EMAIL PROTECTED] --