Fabian Lehman: PDF-Dateischutz auch mit Session und PHP möglich?

Hallo Forumgemeinde,

ich sitzte hier an einem Problem fest und komme einfach nicht weiter.

Die Benutzer können sich über einen PHP Log-In (mysql) auf meine Seite einloggen und haben Ihre eigene Verwaltung.

Hier sollen Sie auch z.B. Ihre PDF Rechnungen einsehen können.
Wie kann ich einen Schutz aufbauen, damit die Unternehmen nur Ihre eigenen Rechnungen einsehen können. Zur Zeit kann man einfach die ID der PDF Datei in der URL ändern und man erhält die Rechnung eines anderen.

1. Soll ich eine PDF-Seiten ID generieren, auf die man per Zufallseingabe nicht kommen kann?

2. Oder ist die Möglichkeit des htaccess Schutzes besser, indem ich jedem Benutzer ein eigenes Verzeichnes spendiere, das dann individuell geschützt ist

oder gibt es eine andere, bessere Möglichkeit?

  1. moin,
    du koenntest auch einfach den dateinamen der rechnung umbenennen (lassen). eine praktische funktion ist hier md5().
    diese funktion generiert einen 32 zeichen langen string den du als datei namen verwenden kannst.

    http://php.net/md5

    Stefan

    Hallo Forumgemeinde,

    ich sitzte hier an einem Problem fest und komme einfach nicht weiter.

    Die Benutzer können sich über einen PHP Log-In (mysql) auf meine Seite einloggen und haben Ihre eigene Verwaltung.

    Hier sollen Sie auch z.B. Ihre PDF Rechnungen einsehen können.
    Wie kann ich einen Schutz aufbauen, damit die Unternehmen nur Ihre eigenen Rechnungen einsehen können. Zur Zeit kann man einfach die ID der PDF Datei in der URL ändern und man erhält die Rechnung eines anderen.

    1. Soll ich eine PDF-Seiten ID generieren, auf die man per Zufallseingabe nicht kommen kann?
    1. Oder ist die Möglichkeit des htaccess Schutzes besser, indem ich jedem Benutzer ein eigenes Verzeichnes spendiere, das dann individuell geschützt ist

    oder gibt es eine andere, bessere Möglichkeit?

    1. Hallo Rainer und alle anderen,

      leider klappt das Einbinden der pdf seite nicht so richtig...

      Hier mein Quelltext:

      <html>
      <head>
      <meta http-equiv="Content-type: application/pdf">
      </head>

      <?php
      fopen("/usr/local/httpd/rechnungen/$pdf_id.pdf","r")
      ?>
      </html>

      Eigentlich müßte das doch gehen oder?

      Für eine Antwort wäre ich sehr dankbar...

      Grüße aus Braunschweig

      Fabian

      moin,
      du koenntest auch einfach den dateinamen der rechnung umbenennen (lassen). eine praktische funktion ist hier md5().
      diese funktion generiert einen 32 zeichen langen string den du als datei namen verwenden kannst.

      http://php.net/md5

      Stefan

      Hallo Forumgemeinde,

      ich sitzte hier an einem Problem fest und komme einfach nicht weiter.

      Die Benutzer können sich über einen PHP Log-In (mysql) auf meine Seite einloggen und haben Ihre eigene Verwaltung.

      Hier sollen Sie auch z.B. Ihre PDF Rechnungen einsehen können.
      Wie kann ich einen Schutz aufbauen, damit die Unternehmen nur Ihre eigenen Rechnungen einsehen können. Zur Zeit kann man einfach die ID der PDF Datei in der URL ändern und man erhält die Rechnung eines anderen.

      1. Soll ich eine PDF-Seiten ID generieren, auf die man per Zufallseingabe nicht kommen kann?
      1. Oder ist die Möglichkeit des htaccess Schutzes besser, indem ich jedem Benutzer ein eigenes Verzeichnes spendiere, das dann individuell geschützt ist

      oder gibt es eine andere, bessere Möglichkeit?

      1. Hallo Fabian,

        so war das nicht gemeint....
        Ich meinte ehere sowas in der Art wie folgt:

        <?php
        /*
          Überprüfung des Benutzers mit session usw.
        */
        if($benutzer_ok)
        {
        header("Content-Type: application/pdf");
        readfile("/usr/local/httpd/rechnungen/$pdf_id.pdf");
        }
        else
        {
        /*
          Ausgabe des entsprechenden HTML-Codes, der zur Authetifizierung auffordert,
          oder eine Umleitung zur Startseite, oder ein Hinweis à la "Sie sind nicht berechtigt,..."
        */
        }
        ?>

        Auf keine Fall kannst Du die PDF-Datei in den HTML-Code "mischen".

        Schönen Gruß

        Rainer

        1. Hallo Rainer,

          danke für die Antwort.

          Die Authentifizierung hat bereits im Vorfeld stattgefunden, daher habe ich sie hier nicht weiter aufgeführt.

          Aber der Befehl fopen im HTML Bereich war wohl total falsch, denn mit deiner Variante geht es einwandfrei.

          Du hast mir sehr sehr weitergeholfen, vielen dank dafür.

          PS:Hätte nicht gedacht, dass Nachrichten, die so weit unten stehen, überhaupt nochmal gelesen werden...
          Danke!

          Hallo Fabian,

          so war das nicht gemeint....
          Ich meinte ehere sowas in der Art wie folgt:

          <?php
          /*
            Überprüfung des Benutzers mit session usw.
          */
          if($benutzer_ok)
          {
          header("Content-Type: application/pdf");
          readfile("/usr/local/httpd/rechnungen/$pdf_id.pdf");
          }
          else
          {
          /*
            Ausgabe des entsprechenden HTML-Codes, der zur Authetifizierung auffordert,
            oder eine Umleitung zur Startseite, oder ein Hinweis à la "Sie sind nicht berechtigt,..."
          */
          }
          ?>

          Auf keine Fall kannst Du die PDF-Datei in den HTML-Code "mischen".

          Schönen Gruß

          Rainer

          1. Hallo,

            Aber der Befehl fopen im HTML Bereich war wohl total falsch, ...

            Nee, so kann man das auch nicht sagen. fopen() gibt erstmal nur einen filehandle zurück,
            von dem Du dann z.B. mit fgets() lesen bzw. auf den Du u.a. mit fputs() schreiben kannst.
            Diese Variante war nur weniger Schreibarbeit, da kein filehandle geöffnet und geschlossen werden muß.
            Trotzdem solltest Du vielleicht noch die Existenz der Datei vorher prüfen...

            PS:Hätte nicht gedacht, dass Nachrichten, die so weit unten stehen, überhaupt nochmal gelesen werden...

            Diese Nachricht steht doch noch nicht weit unten...

            Schönen Gruß

            Rainer

  2. Hallo,

    1. Soll ich eine PDF-Seiten ID generieren, auf die man per Zufallseingabe nicht kommen kann?

    Nein, das ist "Security by Obscurity" und geht irgendwann in die Hose.

    1. Oder ist die Möglichkeit des htaccess Schutzes besser, indem ich jedem Benutzer ein eigenes Verzeichnes spendiere, das dann individuell geschützt ist

    Das ist die einfachste und vermutlich auch sicherste Variante.

    oder gibt es eine andere, bessere Möglichkeit?

    Eine bessere nicht, aber Du könntest die Original-PDF-Seite in einen nicht per HTTP zugänglichen Bereich (deny from all oder außerhalb des DocumentRoot) packen,
    und eine PHP-Seite basteln, die den User prüft und bei erfolgreicher Prüfung die PDF-Seite (natürlich mit passendem Content-Type-Header) ausgibt.

    Schönen Gruß,

    Rainer

    1. Danke für die schnellen und guten Antworten,

      ok, dann werde ich den md5 wieder rausnehmen und die zweite Variante per php versuchen.

      htaccess  würde ich nicht so gern nehmen, weil ich bereits per php eine zugangskontrolle eingebaut habe.

      Grüße Fabian

      Hallo,

      1. Soll ich eine PDF-Seiten ID generieren, auf die man per Zufallseingabe nicht kommen kann?

      Nein, das ist "Security by Obscurity" und geht irgendwann in die Hose.

      1. Oder ist die Möglichkeit des htaccess Schutzes besser, indem ich jedem Benutzer ein eigenes Verzeichnes spendiere, das dann individuell geschützt ist

      Das ist die einfachste und vermutlich auch sicherste Variante.

      oder gibt es eine andere, bessere Möglichkeit?

      Eine bessere nicht, aber Du könntest die Original-PDF-Seite in einen nicht per HTTP zugänglichen Bereich (deny from all oder außerhalb des DocumentRoot) packen,
      und eine PHP-Seite basteln, die den User prüft und bei erfolgreicher Prüfung die PDF-Seite (natürlich mit passendem Content-Type-Header) ausgibt.

      Schönen Gruß,

      Rainer