Sicherheit von Dateien im Verzeichnis
Matt
- projektverwaltung
Hallo,
ich habe ein Projekt übernommen was mir mehr als unsicher vorkommt.
Das Ganze läuft auf einem Apache mit MySQL Datenbank.
Ein System in welches sich Kunden einloggen können (Frontend PHP, Backend MySQL) legt pro registrierten Kunden ein Verzeichnis an (nach der ID in der MySQL Datenbank). Also z.B. data/1
Darunter gibt es ein Verzeichnis was von diversen Buchungen existiert (auch nach der Id in der Datenbank benannt).
Also z.B. data/1/1 | data/1/2 | data/1/3 usw.
darin gibt es diverse Dateien (pdf, xml, png), die dort im Verzeichnis abgelegt werden.
In den Ordner hat ein Kunde keine Einsicht wenn er diesen im Browser aufrufen würde, das ist geschützt. Aber wenn er jetzt auf die Idee kommt und data/5/1/1.pdf aufruft, kann er von anderen die Dateien einsehen.
Wäre jetzt ein Kunde so schlau und macht das, gibt es ein riesiges Problem.
Kann ich das ganze mit htaccess irgendwie beinflussen oder soll ich lieber die Daten per Blob in die MySQL Datenbank speichern und geht das überhaupt?
Lieben Gruß
Hello,
zu .htaccess Möglichkeiten sag ich mal nichts, da bin ich kein Fachmann.
Daten per Blob in die MySQL Datenbank speichern und geht das überhaupt?
das würde gehen, allerdings ist Dateispeicherung in Datenbanken teilweise umstritten und je nach DBMS und Zugriffsmethode auch mit einigen Eigenarten behaftet.
Mein Vorschlag wäre einfach die Daten niemals direkt auszuliefern sondern die Umweg über ein Skript zu gehen. Das Skript ist in der Lage zu prüfen, ob derjenige überhaupt an die Daten herandarf. Sämtliche URLs würden dann in etwa wie folgt aussehen:
http://www.example.com/downloader?get=5/1/5.pdf
Die eigentlichen Verzeichnisse werden entweder außerhalb des document root platziert oder ihnen wird die entsprechende Leseberechtigung entzogen.
MfG
Rouven
Hi!
Mein Vorschlag wäre einfach die Daten niemals direkt auszuliefern sondern die Umweg über ein Skript zu gehen. Das Skript ist in der Lage zu prüfen, ob derjenige überhaupt an die Daten herandarf. Sämtliche URLs würden dann in etwa wie folgt aussehen:
http://www.example.com/downloader?get=5/1/5.pdf
Das hört sich nicht schlecht an, allerdings verhindert dass den direkten Aufruf noch nicht. Da würde mich interessieren was ein access Fachmann dazu sagt ;-)
Die eigentlichen Verzeichnisse werden entweder außerhalb des document root platziert oder ihnen wird die entsprechende Leseberechtigung entzogen.
Das ist wiederrum eine echt gute Idee. Denn wenn die Dateien überhaupt nicht auf der Festplatte des Servers liegen sondern auf einer von aussen nicht zugänglichen kommt man per Direktlink gar nicht an die Datei... klingt gut! Muss ich mal ausprobieren ob man das PDF dann temporär kopiert etc.
Grüße
Hello,
...da hast du mich missverstanden. Die beiden Angaben waren in Kombination zu sehen: benutze das Downloaderskript um Dateien von außerhalb des extern lesbaren Bereiches auszuliefern.
MfG
Rouven
Hello,
Sämtliche URLs würden dann in etwa wie folgt aussehen:
http://www.example.com/downloader?get=5/1/5.pdf
Wieso überhaupt URLs aufbauen mit den Parametern?
Wieso nicht immer einen POST-Dialog führen und überhaupt nicht offenlegen, wie das "Innenleben" der Lösung aussieht?
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hello,
Wieso nicht immer einen POST-Dialog führen und überhaupt nicht offenlegen, wie das "Innenleben" der Lösung aussieht?
na ja, wie schickst du deinem Kollegen dann einen Link auf die Datei, die er sich anschauen soll?
MfG
Rouven
Hello,
na ja, wie schickst du deinem Kollegen dann einen Link auf die Datei, die er sich anschauen soll?
Gar nicht. Ich reiche den Vorgang im Dokumentverwaltungssystem an ihn weiter.
Dann kann er sich daran anmelden und sieht sofort, was er zu bearbeiten hat.
Ich sehe dann, dass er es auch versicht hat und ob er die "fertig-Markierung" gesetzt hat ;-)
Das konnte 1993 schon "Groupwise". Das System auf Novell-Basis war wirklich spitze, wenn es von Fachleuten eingerichtet worden war.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Mahlzeit,
http://www.example.com/downloader?get=5/1/5.pdf
Das hört sich nicht schlecht an, allerdings verhindert dass den direkten Aufruf noch nicht.
Doch. Wenn die Dateien außerhalb des DocumentRoot liegen, hat der Webserver keinen Zugriff auf sie und kann sie deshalb auch nicht ausliefern. Ein serverseitiges Skript könnte allerdings - nach jeweiliger Berechtigungsprüfung - die Dateien direkt an den Browser durchreichen (entsprechende Rechte vorausgesetzt).
Da würde mich interessieren was ein access Fachmann dazu sagt ;-)
Wieso denn Access? Wieso keine vernünftige Datenbank? ;-)
Die eigentlichen Verzeichnisse werden entweder außerhalb des document root platziert oder ihnen wird die entsprechende Leseberechtigung entzogen.
Das ist wiederrum eine echt gute Idee. Denn wenn die Dateien überhaupt nicht auf der Festplatte des Servers liegen sondern auf einer von aussen nicht zugänglichen kommt man per Direktlink gar nicht an die Datei... klingt gut! Muss ich mal ausprobieren ob man das PDF dann temporär kopiert etc.
Ich fürchte, du hast nicht verstanden, was "DocumentRoot" bedeutet. Mit mehreren - gar externen - Festplatten hat das erstmal nichts zu tun.
MfG,
EKKi
Doch. Wenn die Dateien außerhalb des DocumentRoot liegen, hat der Webserver keinen Zugriff auf sie und kann sie deshalb auch nicht ausliefern. Ein serverseitiges Skript könnte allerdings - nach jeweiliger Berechtigungsprüfung - die Dateien direkt an den Browser durchreichen (entsprechende Rechte vorausgesetzt).
Jetzt verstehe ich, DocRoot ;-)
Wie ist es möglich diese Datei außerhalb des DocumentRoots direkt an den Broswer zu reichen?
Wieso denn Access? Wieso keine vernünftige Datenbank? ;-)
Ich meine htaccess (Verzeichnisspezifische Einstellungen am Webserver) und nicht Access als Datenbank.
Oder meintest du das?
Danke für deine Hilfe
Hello,
Wie ist es möglich diese Datei außerhalb des DocumentRoots direkt an den Broswer zu reichen?
genau so wie ich es geschrieben habe: mit einem Skript, das im DocumentRoot liegt (damit der Browser es erreichen kann) und das seinerseits die Datei ausliest und den Inhalt an den Browser schickt.
MfG
Rouven
Mahlzeit,
Wie ist es möglich diese Datei außerhalb des DocumentRoots direkt an den Broswer zu reichen?
genau so wie ich es geschrieben habe: mit einem Skript, das im DocumentRoot liegt (damit der Browser es erreichen kann) und das seinerseits die Datei ausliest und den Inhalt an den Browser schickt.
Genau das meinte ich. :-) In PHP z.B. Stichwort "readfile()" ...
MfG,
EKKi
Hallo,
Kann ich das ganze mit htaccess irgendwie beinflussen
Nein. Du brauchst zwei Dinge:
1. Autentifizierung
2. Autorisierung
Mit .htaccess kannst Du nur 1. implementieren.
oder soll ich lieber die Daten per Blob in die MySQL Datenbank speichern und geht das überhaupt?
Wo die Daten liegen, ist piepegal (außer unterhalb der Webroot!!!). Deine Anwendung sollte bei jedem Request prüfen, ob der Benutzer sich ausgewiesen hat (Autentifizierung) und ob er für Datenzugriff autorisiert ist.
Viele Grüße,
Horst Haselhuhn
Hello,
Nein. Du brauchst zwei Dinge:
- Autentifizierung
- Autorisierung
Mit .htaccess kannst Du nur 1. implementieren.
Was ist denn dann "require valid user" ?
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hello,
Nein. Du brauchst zwei Dinge:
- Autentifizierung
- Autorisierung
Mit .htaccess kannst Du nur 1. implementieren.
Was ist denn dann "require valid user" ?
Das ist 1., die Autentifizierung
Eine Autorisierung hingegen geht darüber hinaus (Stichwort: Benutzerverwaltung mit Berechtigungs-System), glaubs mir, ich habe auch ein Weilchen gebraucht um das zu verstehen. Geholfen hat mir dabei das Schreiben von Webanwendungen, wo beides gebraucht wird.
Viele Grüße,
Hotte
Hello,
- Autentifizierung
- Autorisierung
Mit .htaccess kannst Du nur 1. implementieren.
Was ist denn dann "require valid user" ?
Das ist 1., die Autentifizierung
Und wenn Du nun für bestimmte limits nur bestimmte User zulässt?
Was ist das dann?
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hello Tom,
- Autentifizierung
- Autorisierung
Mit .htaccess kannst Du nur 1. implementieren.
Was ist denn dann "require valid user" ?
Das ist 1., die Autentifizierung
Und wenn Du nun für bestimmte limits nur bestimmte User zulässt?
Was ist das dann?
Das würde ich unter "Autorisierung" einordnen. Mittlerweile ist mir dazu auch noch ein Vergleich eingefallen (alle Vergleiche hinken):
Ein Benutzer loggt sich mit telnet oder ssh auf einer LINUX-Kiste ein. Das ist die Autentifizierung.
Die Autorisierung hingegen beschreibt folgenden Sachverhalt: In seinem Home-Verzeichnis kann Benutzer alles machen, in den Verzeichnissen anderer Benutzer jedoch nichts, es sei denn, andere Benutzer oder root erlaubt es.
Bekanntlichermaßen gibt es unter LINUX die Berechtigungen Lesen, Schreiben, Ausführen für Dateien (und Verzeichnisse), die entweder an den Owner, eine Gruppe oder an Alle gebunden sind.
Genau sowas, oder sowas ähnliches lässt sich auch in Webanwendungen hineinbauen, abstrakt: Benutzer kommt rein (Autenti), aber was er darf oder nicht darf (Autori) ist anderweitig festgelegt.
Schon ist es möglich, sowas in der Art alleine mit .htaccess zu machen, aber ob das sinnvoll und überhaupt überschaubar ist, ist eine andere Geschichte.
Für die hier geschilderte Problemstellung empfehle ich eine eigens geschriebene Benutzerverwaltung mit klarer Trennung von Anmeldung und Autorisierung.
Viele Grüße zum Berg,
Hotte
Hallo,
- Autentifizierung
- Autorisierung
... ich habe auch ein Weilchen gebraucht um das zu verstehen.
Meine Eselsbrücke:
• Authentifizierung fragt, ob der Unbekannte überhaupt derjenige ist, der er vorgibt zu sein.
• Autorisierung fragt, ob der inzwischen Identifizierte etwas bestimmtes überhaupt darf.
Tim