Ankündigung

Einklappen
Keine Ankündigung bisher.

.pdf Aufruf / Download verhindern, aber dennoch auf Homepage anzeigen lassen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • .pdf Aufruf / Download verhindern, aber dennoch auf Homepage anzeigen lassen

    Hallo liebes PHP.de Forum,
    ich bin Hobby PHPler und bin gerade an einem Projekt, dass einiges an Funktionen können soll

    Meine Aufgabe ist hoffentlich leicht verständlich, ich habe einen Kundenlogin, diese Laden .pdf´s (Rechnungen, Ausgaben, etc.) hoch.
    Natürlich sind Rechnungen oft sehr vertraulich und sollten daher nicht von jeder Person über den Webbrowser aufgerufen werden können.

    2 Möglichkeiten kommen mir in den Kopf, es happert aber an der Umsetzung.

    .htaccess
    - Funktioniert ganz gut, die .pdf´s sind nicht mehr aufrufbar, allerdings auch nicht mehr das Einbinden auf der Webseite.

    Dateien in das Root Verzeichnis legen und via .php aufrufen lassen.
    - Die Idee find ich persönlich sehr interessant, allerdings ruft mein Webspace (Anbieter : Strato) den Pfad (weder /var/home/kdrn/... noch .../.../.../Dateiname/) nicht auf.

    Nach 2 Tagen suchen und probieren bin ich am Ende, hat jemand eine Idee oder ähnliches schon einmal versucht?
    Ich bin für jeden Tipp dankbar und werde das fertige Script dann gerne auch posten

    Liebe Grüße und danke schon einmal!
    Matlox

  • #2
    Dateien in das Root Verzeichnis legen und via .php aufrufen lassen.
    Das.

    - ... , allerdings ruft mein Webspace (Anbieter : Strato) den Pfad (weder /var/home/kdrn/... noch .../.../.../Dateiname/) nicht auf.
    Was? Hast du ein Verzeichnis überhalb des www-roots? Da kommst du dann nur mit PHP auf File-Ebne hin (und nicht via Browser), darum gehts ja.

    Nur als Info noch: Du könntest die PDF theoretisch auch als BLOB in die DB geben. Hat Vor- und Nachteile.. siehe hier zb: https://www.php.de/forum/webentwickl...79#post1209079
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Dateien ausserhalb des Webroots (kein direkter Zugriff).
      Das Script zum Abrufen von Dateien muss das Rechtesystem beachten (hoffentlich hast du eins)

      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Zitat von Matlox Beitrag anzeigen
        allerdings ruft mein Webspace (Anbieter : Strato) den Pfad (weder /var/home/kdrn/... noch .../.../.../Dateiname/) nicht auf.
        das ist jetzt sicher nur schlecht formuliert - also falls du meinst dein Browser ruft die Datei nicht auf: das hast du damit ja effektiv verhindert, genau was du wolltest. Technisch musst dein PHP-Script halt den internen Pfad aufrufen und die Datei z.B. mit readfile() ausliefern, du machst damit ja effektiv eine Umleitung + Rechte.
        [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

        Kommentar


        • #5
          Hallo und danke erst einmal für eure Antworten!
          etwas eigenartig formuliert, entschuldigt bitte

          PDF in die DB möchte ich verhindern, unschön und die DB is eh schon sehr ausgelastet durch die Useranzahl

          Gut, nehmen wir die Variante mit dem Ordner außerhalb des Verzeichnisses.

          Verzeichnissaufbau:

          Code:
          Root/
          Root/homepage/index.php (aufrufbar via. www.domain.de/index.php)
          Root/pdf/datei.pdf (natürlich nicht über Url aufrufbar)
          nun setze ich in die index.php

          PHP-Code:
          header("Content-type: application/pdf");
          header("Content-disposition: attachment; filename=".basename($path));
          readfile($path); 
          $path sollte ja dann in diesem Fall "../pdf/datei.pdf" sein, richtig?

          Habe nun leider gerade keine möglichkeit das Script erneut zu testen, aber genau das hatte ich gestern in 100 verschiedenen Varianten getestet ...

          Kommentar


          • #6
            Abgesehen davon das dieses Script keine Berechtigung auf die Datei überprüft, müsste das so funktionieren...
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Hallo lstegelitz,
              ​zuhause angekommen, gleich weiter gecodet und siehe da, endlich geschafft!

              Zum Code für die jenigen, die etwas ähnliches mal brauchen:

              PHP-Code:
              Login_via_session_ueberpruefen();
              mysqlconnect();
                   
              if(isset(
              $_GET["i"])) {
                   
              $theid $_GET["i"];
              $sessionid $_SESSION["sessionid"];      
              $query "SELECT `pdfurl` FROM `dokumente` WHERE `id` = '$theid' AND `userwhouploaded` = '$sessionid'";
              $result mysql_query($aquery);
              $row mysql_fetch_array($result);
                   
              if (
              mysql_num_rows($aresultcheck) > 0)  {
              $pdfurl $row["pdfurl"]; }
              else { 
              $pdfurl "no_pdf.pdf"; }
                 
              header("Content-type:application/pdf");
              $path "./../ordnerauserhalbvonroot/$pdfurl";    
                
              readfile($path); } 
              Einbinden kann man das ganze durch:

              PHP-Code:
                <embed data="?site=pdfview&i=<? echo "$id"; ?>" type="application/pdf" src="?site=pdfview&i=<? echo "$id"; ?>"></embed>
              ?site muss natürlich auf die .php Datei führen. Warum es bei mir nicht geklappt hat --> durch ob_start(); wurde der Header mitten im Script nicht ausgeführt.


              Ich hoffe mit diesem Script konnte ich auch mal jemanden helfen

              Kommentar


              • #8
                Eine tolle Sicherheitslücke hast du da gebaut. Du beachtest den Kontextwechsel nach SQL nicht, dafür gibts die Funktion mysql_real_escape_string().

                Und die mysql_* Funktionen sind generell veraltet und sollte nicht mehr verwendet werden.

                Kommentar


                • #9
                  Zitat von hellbringer Beitrag anzeigen
                  Eine tolle Sicherheitslücke hast du da gebaut. Du beachtest den Kontextwechsel nach SQL nicht, dafür gibts die Funktion mysql_real_escape_string().

                  Und die mysql_* Funktionen sind generell veraltet und sollte nicht mehr verwendet werden.
                  Hi,
                  ich habe noch eine set_safe_sql(); funktion an jeder variable, die eine erweiterte mysql_real_escape_string(); funktion beinhaltet.
                  habe zuletzt vor jahren .php anwendungen programmiert, sollte ich auf PDO umsteigen?

                  lg und danke für deine nachricht!

                  Kommentar


                  • #10
                    Zitat von Matlox Beitrag anzeigen
                    ich habe noch eine set_safe_sql(); funktion an jeder variable, die eine erweiterte mysql_real_escape_string(); funktion beinhaltet.
                    Sowas kann nur Quatsch sein. Es gibt keinen Grund mysql_real_escape_string() zu "erweitern". Es tut genau das, was erforderlich ist.

                    Zitat von Matlox Beitrag anzeigen
                    habe zuletzt vor jahren .php anwendungen programmiert, sollte ich auf PDO umsteigen?
                    Zumindest auf mysqli. PDO wäre IMHO zu bevorzugen, ist aber natürlich ein größerer Umstieg.

                    Kommentar


                    • #11
                      Zitat von hellbringer Beitrag anzeigen

                      Sowas kann nur Quatsch sein. Es gibt keinen Grund mysql_real_escape_string() zu "erweitern". Es tut genau das, was erforderlich ist.



                      Zumindest auf mysqli. PDO wäre IMHO zu bevorzugen, ist aber natürlich ein größerer Umstieg.
                      Danke erst einmal für die rasche Antwort!
                      Da das Script sehr sicher sein soll, würde ich auch direkt auf PDO umsteigen.

                      Wie man oben am code sieht verwende ich eine mysql_con(); funktion, diese würde dann wegfallen und durch eine require(); funktion mit der PDO Connection beinhalten oder?
                      Des weiteren müsste ich auch alle Verbindungen, Ausgaben und Einträge anders aufbauen so wie ich mir das mal durchgelesen habe?

                      Zu guter letzt habe ich auch noch eine Frage zur Mysql Datenbank.

                      Es sollen mehrere Kunden auf eine Datenbank, diese können dann Ihre PDF´s (z.B.) Uploaden.
                      Pro Kunde bestehen mit der Zeit ca. 1000 Einträge, bei ca. 1000 Kunden.

                      Nun habe ich eine Tabelle mit (z.b.) TABELNAME.PDF.
                      In dieser Tabelle befindet sich der "PdfPfad" und die "UserUploaderId", die beim Upload der Dateien immer mirgegeben wird und somit dann per PHP nur die angezeigt werden die wirklich zum User gehören.

                      Ist es sinnvoller für jeden User bei der Registrierung eine eigene Tabelle zu erstellen (bsp. $userid_table_pdf) oder macht es keinen unterschied alle Einträge unter einer Tabelle zu sortieren?


                      Ich sage jetzt schon einmal vielen Dank für die Hilfe!

                      Kommentar


                      • #12
                        Zitat von Matlox Beitrag anzeigen
                        Ist es sinnvoller für jeden User bei der Registrierung eine eigene Tabelle zu erstellen (bsp. $userid_table_pdf) oder macht es keinen unterschied alle Einträge unter einer Tabelle zu sortieren?
                        Tabellen sollten in der Regel zur Laufzeit überhaupt nicht erstellt oder verändert werden.

                        Kommentar


                        • #13
                          Zitat von hellbringer Beitrag anzeigen

                          Tabellen sollten in der Regel zur Laufzeit überhaupt nicht erstellt oder verändert werden.
                          Sehr, sehr vielen Dank hellbringer!
                          dann bin ich nun mal an der Umstellung auf PDO dran

                          Kommentar

                          Lädt...
                          X