phpbar.de logo

Mailinglisten-Archive

[php] Re: =?iso-8859-1?Q?=5Bphp=5D_gesch=FCtzte_Daten?=

[php] Re: =?iso-8859-1?Q?=5Bphp=5D_gesch=FCtzte_Daten?=

Manuel Hossfeld lists_(at)_hossfeld.de
Thu, 29 Jul 1999 21:45:46 +0200


Hallo,

> Ich bin gerade mit der Realisation eines Up-/Downloadtools
> in php beschäftigt. Eines meiner grundlegenden Probleme ist:
> Wie und Wo bringe ich die Dateien unter, damit sie nur nach
> Authorisierung durch das php-tool downgeloaded bzw.
> upgeloaded werden können?

Zufälligerweise habe ich genau sowas gerade vor kurzem auch gebraucht. (D.h.
genaugenommen nur für den Download, aber Upload läuft entsprechend).

> Meine momentane Lösung sieht die Speicherung in
> einem Skript-Verzeichnis (ExecOnly) vor. Download würde
> also nur funktionieren, wenn die Datei durch ein php-Modul
> durchgeschleust wird, welches die Datei einliest und an den
> Browser weiterleitet.

Jawoll... Wobei ich persönlich ein Verzeichnis komplett außerhalb des
Serverroots bevorzugen würde. Das muss dann auch nicht "ExecOnly" sein.

> Gibt es noch eine bessere Lösung?
> Kennt jemand fertige Up/Download-Tools mit
> Rechteverwaltung unter php?

Nö. Ist aber auch nicht sooo schwierig selbst zu machen. Und außerdem
individueller! ;-)

Mein "Secure Download Wrapper" sieht jedenfalls ungefähr so aus (Kommentare im
Source):

-----------------
<?php
// "security wrapper" zum files downloaden/ansehen
//
// Hinweis: Ich habe für die Authentifizierung und Autorisierung die PHPLIB
// genommen (IMHO sehr empfehlenswert) - das Prinzip sollte aber auch ohne
// PHPLIB funktionieren.

// Gleich ´raus falls keine Parameter gegeben:
if (!isset($f) or !isset($dt)) { exit; }

// $f ist der Pfad zu der Datei die downgeloadet werden soll (Achtung:
// so wie´s hier ist besteht ein mögliches Sicherheitsloch darin, daß ein
// user eine bekannte Datei auf dem Server "ausspähen" könnte. "in real life"
// muss $f also noch überprüft werden (und/ oder z.B. an einen festen Pfad
// angehängt werden)
// $dt ist der "document type", d.h. der MIME type.

// Das hier ist der function call zum "öffnen" einer Seite für die PHLIB
// Er stellt sicher, daß der User auch angemeldet ist, bzw. eine gültige
// Session hat - wenn nicht, bekommt er einen Login-Screen
page_open (array ("sess"=>"DMPS_Session","auth"=>"DMPS_Auth","perm"=>"DMPS_Perm"));
// Ohne PHPLIB müsstest Du halt an dieser Stelle irgendwie selbst feststellen,
// ob bzw. welcher User angemeldet ist usw...

// Hier wäre der richtige Platz, um spezifische Rechte zu checken (falls z.B.
// manche User nur bestimmte Sachen downloaden dürfen etc.):
// bei PHPLIB wäre das dann z.B.    $perm->check("admin");

// Hier wird jetzt der korrekte MIME-type anhand von $dt ermittelt und gesendet
// z.B. 
if ($dt == "pdf") {
	header ("Content-type: application/pdf");
}
else
{
	// in meinem Fall brauchte ich außer bei PDF keine korrekten MIME-types
	// also schicke ich bei allen "nicht-PDFs" einen "Standard-Header"
	// für binaries:
	header ("Content-type: application/octet-stream");
	// BTW: Dieses "feature" könnte man auch nutzen, um ein downloaden
	// von filetypen zu erzwingen, die sonst z.B. direkt im Browser
	// (oder durch ein Plugin) angezeigt werden würden
}

// Jetzt den Filenamen setzen (kann sich natürlich vom "echten" unterscheiden)
header ("Content-disposition: inline; filename=$f");
// und die Länge...:
$length = filesize($f);
header ("Content-length: $length");

// Hier erfolgt das eigentlich Einlesen bzw. "Durchreichen" der Datei:
readfile ($f);

page_close();
// analog zu page_open() - sagt der PHPLIB, daß hier die seite "aufhört"
// (schreibt Session-Daten in die DB usw.)

-----------------------
Das war´s schon.
Hoffe das gibt einen ersten Anhaltspunkt.

CU,
Manuel

-- 
Quote of the month:
"The parade that´s electrical, it serves no real purpose
 Takes up a lot of juice, just to impress us."
	(No Doubt, "Tragic Kingdom")


php::bar PHP Wiki   -   Listenarchive