Dateizugriff beschränken

Sprint

Erfahrenes Mitglied
Hallo,

folgendes Problem stellt sich mir im Moment. Auf eine neue Seite können mehrere Firmen zugreifen, um ihre Berechnungen zu machen. Dabei werden jedesmal mehrere PDF Dateien erzeugt. Diese Dateien werden (auch zur späteren Nutzung) nicht nur angezeigt sondern auch auf dem Server im jeweils eigenen Verzeichnis gespeichert. Wie kann man nun verhindern, daß eine Firma auf die Dateien der anderen zugreift? htaccess ginge zwar, aber dann müßte man auch beim Aufruf der eigenen Dateien diese Abfrage beantworten. Das halte ich für nicht sonderlich benutzerfreundlich. Oder kann man die Abfrage abfangen und durch PHP beantworten lassen, so daß bei Zugriff auf das eigene Verzeichnis die Abfrage gar nicht erst kommt?

Danke schonmal,
Sprint
 
Warum verpasst du jeder Datei nicht eine einmalige ID? Also 29tjfoiqfhj43hft3aqg4.pdf? Hmm...sicherlich ist dies etwas doof für den Kunden wenn er eigentlich nur die Rechnung will. Aber du könntest das ganze auch mittels mysql lösen:

Erstelle dir eine Tabelle (id, kunde, datei_anzeige, datei_code)
So wenn ich jetzt auf Rechnung November 2010 klicke klicke ich nicht direkt die Datei an, sondern download.php?file=23rfij24fh248gh42

In der download.php prüfe ich nun, ob Kunde 1 Zugriff auf die Datei mit dem datei_code 23rfij24fh248gh42 hat und wenn ja, soll er die Datei Rechnung_nov_2010.pdf zuschicken. Das einzige was dann noch ist bei dem Dialog "Speichern unter..." dass da auch die komplette URL mitgeliefert wird. Da weiß ich nicht, ob da die download.php?23rfij24fh248gh42 mitgegeben wird oder tatsächlich direkt der Dateipfad.

Also Du musst in jedem Fall überprüfen, ob Kunde 1 eine "Berechtigung" hat, die Datei aufzurufen. Stell Dir mal vor, jeder wüsste den Pfad zu meinen Rechnungen, Angeboten usw. Da kann sich dann ja jeder schön durchklicken.
 
Zuletzt bearbeitet:
Wenn, dann müßte auch bei der MySql Lösung die Datei ebenfalls den "Zufallsnamen" haben, da man sonst aus dem Namen der eigenen Datei auf die Namen der fremden Dateien schließen kann.
Dann sollte es aber auch reichen, als Teil des Dateinamens die einmalige ID der Firma zu setzen. Da die PDFs sowieso nie direkt sondern immer über das Programm aufgerufen werden, ist der Name egal. Und wenn die ID wirklich zufällig ist, muß man bei einer 15 oder 20 stelligen ID schon lange probieren, bis man da eine erwischt.

Danke für den Tip!
 
Jein. Wenn Du Dateien direkt und ausschließlich über download.php?blub aufrufen lässt, sieht der Nutzer auch nur download.php?blub - Wenn Du in der download.php nun Prüfst, ob a) Kunde eingeloggt ist und b) auch wirklich auf die Datei zugreifen darf, und erst dann die Datei direkt aufrufst mittels:

PHP:
header("Content-Type: $type");
header("Content-Disposition: attachment; filename=".$file);
readfile($file);
öffnet sich direkt das Downloadfenster (Speichern unter..) Und hier kommt es eben nur noch drauf an, ob die Ursprungs-URL mitgesendet wird oder eben nicht.

Ich würde, auch wenn die Datei eine zufällige Zahl ist, dennoch prüfen ob derjenige die Datei aufrufen darf. Es ist für "Hacker?" denke ich kein Problem ne URL Liste zu erstellen und diese einfach abzufragen. Dauert zwar bisschen aber es geht sicherlich, oder?
 
Zuletzt bearbeitet:
Hallo,

würde es nicht reichen, den Zugriff auf die Dokumentenordner über die URL komplett zu sperren (genauer: umzulenken)? Kunde xy bekommt seine Dokumente über seine Downloadseite, z.B. alles, was sich in Ordner 1 befindet. Kunde ab hat alle Dokumente in Ordner 2 usw. Auf dem Webserver liegt so z.B. alles in /dokumente/1/, /dokumente/2/ usw.
Den direkten Zugriff auf /dokumente/ unterbinde ich via .htaccess über eine Rewriterule:

PHP:
RewriteEngine On
RewriteBase /
Rewriterule dokumente /index.php [R=301,L]

Damit sollte jeder URL-aufruf auf o.g. Ordner auf die Startseite umgelenkt werden. Man könnte das Ganze auch noch dahingehend verfeinern, dass man anstelle auf die Hauptseite zu lenken (und zu bleiben), den eingeloggten User auf seine Downloadseite lenkt. Dazu verpasst man o.g. Rule noch einen Parameter (flag), der der index.php sagt, dass man von einer umgelenkten Seite kommt: z.B. index.php?redirect=1. Jetzt prüft man auf der index.php, ob der User eingeloggt ist. Wenn ja, ab zur Downloadseite, wenn nein, bleibt er, wo er ist (oder wird auf eine Login-Seite umgelenkt). Die 1 ist nur als Flag zu verstehen, nicht als Ordner- oder Usernamen!

Das einzigste, was man bei dieser Lösung jedoch nie machen sollte, ist, seine .htaccess zu löschen :-)

Greetz
cw
 
Zuletzt bearbeitet:
@QUEST08: Ist auch wieder richtig. Auf jeden Fall hab ich jetzt eine grundsätzliche Lösung für mein Problem, was auch immer endgültig zum Einsatz kommt.

@chickenwing: Eine zentrale Download Seite funktioniert nicht, da die verschiedenen PDFs über zig Seiten verteilt sind, die wiederum nicht für jeden User zugänglich sind.
 
Zuletzt bearbeitet:
Zurück