RE: Dateien vor direktem Zugriff schützen

2006-07-19 Diskussionsfäden Andreas Müller
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

2006-07-19 Diskussionsfäden Andreas Müller
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

2006-07-18 Diskussionsfäden James Blond

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

2006-07-18 Diskussionsfäden Andreas Müller
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

2006-07-18 Diskussionsfäden James Blond

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

2006-07-18 Diskussionsfäden Christopher Gerharz
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

2006-07-18 Diskussionsfäden Marcus Reimann
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]
--