Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit PHP Download per Header Befehl

Einklappen

Neue Werbung 2019

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

  • Problem mit PHP Download per Header Befehl

    Moin Zusammen,

    folgendes Problem:

    ich habe einen Download implementiert der eine Textdatei als Download erzwingt.

    Folgender Header wird dafür geschickt:

    PHP-Code:
    function download($Datei){
        
    $Dateiname basename($Datei);
        
    $Größe filesize($Datei);
        
    header("Content-Type: text/plain");
        
    header("Content-Disposition: attachment; filename=".$Dateiname);
        
    header("Content-Length: ".$Größe);
        
    readfile($Datei);
    return 
    true;

    Die Function wird aufgerufen indem ich die Seite erneut aufrufe.

    Funktioniert alles soweit. Das einzige Problem ist das wenn ich danach auf einen anderen Menue-Button auf meiner Webseite der Quelltext als Text interpretiert wird und im Volltext an angezeit wird. Erst bei klicken des Nächsten Button wird wieder HTML ausgegebe und vom Browser richtig interpretiert.

    Danke für Ratschläge.

    Matthieu

  • #2
    Die Scriptverarbeitung (und damit der Response) sollte nach dem readfile() beendet werden -> exit. Bei dir ist die Verbindung wohl noch offen, aber die Datei auf dem Client schon geschlossen. Der Browser hat im Hinterkopf noch den "text/plain" header und gibt die nachfolgenden Daten entsprechend aus.

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

    Kommentar


    • #3
      Normal sollte das Scriptende ausreichend sein und somit der Code soweit in Ordnung. Fehler können allerdings von eventuellen weiteren echo ""; Aufrufen produziert werden, sowie (versteckte) New-Lines außerhalb von <?php ... ?>.

      Zur Info noch für dich:
      Deine Methode ist potentiell offen für Sicherheitsprobleme. Jede lesbare Datei kann an diese Methode übergeben und ausgelesen werden. Du solltest dringend eine Prüfung einbauen, ob der Pfad zur Datei im $_SERVER['DOCUMENT_ROOT'] liegt. Sofern du es nicht schon getan hast.

      Edit:
      Auch im document_root solltest du prüfen, dein config liegt vermutlich auch darin und könnte so mit den Passwörtern im Klartext ausgeliefert werden.
      PHP online testen, zum Beispiel: md5, base64_decode, preg_match, urldecode und viele weitere...

      Kommentar


      • #4
        Die Funktion returned nach Abarbeitung, potentiell können noch Code (und Ausgaben) folgen...
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Hallo zusammen,

          danke für die Antworten. Das mit dem exit werde ich sofort probieren.
          Das Sicherheitsproblem kenne ich, ist aber nicht tragisch den der Dateiname
          PHP-Code:
          ($Datei
          ist immer derselbe und ist als Variable festgelegt. Die fuktion ist nur der übersichthalvber als function programiert, sie bekommt immer denselben Dateinamen als Parameter.

          Gruss

          Matthieu

          Kommentar


          • #6
            Hallo,

            ich habe nun gemerkt dass der Fehler nur auftritt wenn man das Downloadfester Abbricht. Wie kann den das Script mitbekommen dass der Download nicht erfolgreich war??

            Gruss

            Kommentar


            • #7
              Zitat von Kingkarule Beitrag anzeigen
              Das Sicherheitsproblem kenne ich, ist aber nicht tragisch den der Dateiname ($Datei) ist immer derselbe und ist als Variable festgelegt.
              Dass sich Variable und festgelegt widersprechen, ist dir hoffentlich klar.

              Die fuktion ist nur der übersichthalvber als function programiert, sie bekommt immer denselben Dateinamen als Parameter.
              Irgendwann wirst du (oder jemand anderes) sich freuen, dass es für sowas schon eine Funktion gibt, sie benutzen - und dann beißt dich diese Sicherheitslücke in den Allerwertesten, weil du dann nicht mehr daran denkst, dass der Parameter nicht abgesichert wird.


              „Ja ich weiß, aber ...“ ist in solchen Fragen die dümmstmögliche Reaktion.

              Sich darauf zu verlassen, dass der Benutzer (und wenn man der nur selber ist) die Funktion immer nur mit den „richtigen“ Parametern aufrufen wird, ist grob fahrlässig, naiv und schlichtweg dämlich.

              Tu' dir das selber nicht an - sondern setze deine Scripte vernünftig um, wenn du schon auf solche Lücken hingewiesen wirst.
              [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

              Kommentar


              • #8
                Hmm, recht magst du haben.
                Dass du damit mein eigentlich Problem völlig ignorierst, und in keinen 10 Zeilen zwei mal Derivate von Dumm benutzt ist nur mittel hilfreich.
                Hast du noch was weiterführendes zu meiner Frage oder noch nur noch mehr beleidigende Belehrungen auf Lager??

                Mit weniger freundlichen Grüssen.

                Kommentar


                • #9
                  Wenn man bedenkt, was durch so eine kleine Unachtsamkeit alles verursacht werden kann, war der etwas direktere Hinweis nicht unfreundlich.

                  Eine Lösung für dein Problem wurde oben schon angegangen. Bisher fehlt deine Rückmeldung, ob sich das Problem durch exit oder die() hat lösen lassen.

                  Wenn du den Download abbrichst (per ESCAPE) werden die Daten nicht sauber übertragen. Damit musst du leben.
                  PHP online testen, zum Beispiel: md5, base64_decode, preg_match, urldecode und viele weitere...

                  Kommentar

                  Lädt...
                  X