Matt: Sicherheit von Dateien im Verzeichnis

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ß

  1. 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

    --
    -------------------
    There's no such thing as a free lunch  --  Milton Friedman
    1. 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

      1. 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

        --
        -------------------
        Vegetarier essen meinem Essen das Essen weg.
      2. 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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. 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

          --
          -------------------
          Inter Arma Enim Silent Leges  --  Cicero
          1. 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

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      3. 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

        1. 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

          1. 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

            --
            -------------------
            There's no such thing as a free lunch  --  Milton Friedman
            1. 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

  2. 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

    1. Hello,

      Nein. Du brauchst zwei Dinge:

      1. Autentifizierung
      2. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. Hello,

        Nein. Du brauchst zwei Dinge:

        1. Autentifizierung
        2. 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

        1. Hello,

          1. Autentifizierung
          2. 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

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

          1. Hello Tom,

            1. Autentifizierung
            2. 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

        2. Hallo,

          1. Autentifizierung
          2. 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