Mailinglisten-Archive |
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