[PHP & MySQL] Datei sicher zum Client schicken



  • Ich möchte folgendes auf meiner Webseite haben:
    Ein User kann sich mit einer Email & Passwort eine festgelegte Datei.zip herunterladen.

    Ich hab im Moment die Datenbank Anbindung realisiert und gebe aus, ob der Login korrekt oder falsch war. Hier der Code:

    <?php
    $Email = $HTTP_POST_VARS['email'];
    $Pass = $HTTP_POST_VARS['pass'];
    
    if($Email && $Pass)
    {
        mysql_connect
        mysql_select_db
    
        $qstr = "SELECT * from table where Email='$Email' and HwID='$Pass'"; 
        $result = mysql_query($qstr);
    
        if (mysql_num_rows($result))
        {
            echo "Login succesfull!";
        }
        else
            echo "<font color='#FF0000'>Login information incorrect!</font>";
    
        mysql_close();
    }
    ?>
    

    Wenn der Login ok ist möchte ich dem User eine Datei schicken, die er am Besten speichert. Den Namen der Datei (bei jedem User anders) könnte ich aus der DB holen, das kommt mir am sichersten vor.

    Kann ich eine .htaccess in einem extra Verzeichnis anlegen, wo php dann die Datei herholt, aber ein normaler User der sich nicht eingeloggen hat auch nicht zugreifen kann?

    Ich hab schon die Funktion header() gefunden. Sollte ich die benutzen? Sieht der User dann den Pfad wo die Datei gespeichert ist?

    Ich wäre für Vorschläge sehr dankbar!

    atz



  • ich glaube das was du suchst lässt sich nur mit dem rechtesystem von Linux realiesieren. (Könnte eventuell auch mit .htaccess funktionieren). Einfach mal mit der chmod funktion im FTP-Programm spielen.



  • Wenn du über htaccess den Zugriff schützt kannst du mit PHP (falls ich deine Frage richtig verstanden habe) immer noch auf die Dateien aus diesem Verzeichnis zugreifen 😉



  • Ich hab jetzt ein Verzeichnis mit .htaccess geschützt. Und mit diesem Code geht der Download:

    $file = 'dir.htaccess/datei.zip';
    
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Pragma: no-cache");
    header("Content-Type: application/octet-stream");
    header("Content-Transfer-Encoding: Binary");
    header("Content-Disposition: attachment;
    filename=\".basename($file)\"");
    header("Content-Length: ".filesize($file));
    @readfile($file);
    

    Das dumme ist bloß, das die Datei angezeigt wird 😕 ?
    Kein Scherz!
    Wenn ich den Code alleine ausführe, will mein IE die Datei runterladen. Wenn es jedoch im if statement steht dann wird die Datei angezeigt.
    Wie kann ich das verhindern?

    Vielleicht muss ich so eine 3 sec. Download wartezeit einfügen. Wie geht das?

    atz



  • Aus dem php manual:

    Beachten Sie, dass header() aufgerufen werden muss, bevor eine Ausgabe gesendet wurde, egal ob normale HTML Tags, leere Zeilen in einer Datei oder von PHP.

    Also darf ich header() nicht verwenden, nachdem schon etwas ausgegeben wurde.
    Wenn ich das mache, dann kann ich die Datei downloaden.

    atz



  • atzplzw schrieb:

    Aus dem php manual:

    Beachten Sie, dass header() aufgerufen werden muss, bevor eine Ausgabe gesendet wurde, egal ob normale HTML Tags, leere Zeilen in einer Datei oder von PHP.

    Soll heißen du darfst nichts an HTML Code bis dahin ausgeben haben, also kein echo oder wenn du dein Script mit <?php ?> in einer normalen HTML Datei hast, muss <?php ?> ganz am Anfang stehen.

    Hast du das Problem jetzt eigentlich gelöst, das geht aus deinem letzten Posting nicht so klar hervor.



  • Richtig, es darf kein HTML ausgegeben werden und ja, Problem gelöst.

    Danke für die Nachfrage...



  • Is das nich irgendwie logisch, das kein HTML ausgegeben werden darf?

    Ich meine...
    Wie sieht wohl eine JPG aus, in der Mitten in der File Text dann
    <table style="background: yellow;">
    steht? 😉


Anmelden zum Antworten