Datei Download

  • Guten Tag,


    ich habe ein kleines Problem. Ich bin aktuell dabei ein File Upload + Download zu erstellen. Das klappt soweit auch ganz gut.

    Nur ist es so das wenn ich eine Datei Downloaden möchte, der Fehler "Diese Seite <IP - Adresse> wurde nicht gefunden".


    Das ganze ist aber nur bei einigen Dateien. Andere Dateien kann ich ganz normal herunterladen.



    Beispiel mit zwei Dateien.


    Datei 1 Name: install.txt (Diese Datei lässt sich ganz normal herunterladen)

    Datei 2 Name: 3.5_Lösung_Computer.pdf (Wenn ich diese Datei herunterladen möchte kommt der Fehler "Diese Seite <IP - Adresse> wurde nicht gefunden".


    So ist der Download Button aufgebaut:

    $ausgabeDatei ist in dem Fall nur der Dateiname.

    <a href="includes/downloadFile.php?file=<?php echo $ausgabeDatei ?>" type="submit" class="btn btn-info btn-fill pull-right btn-sm">Download</a>


    Das ist die "downloadFile.php" Datei:



    Die Dateien liegen im selben Ordner.

    Hat jemand eine Idee?



    Lieben Gruß

    Marvin

  • Sobald ich die Datei umbenenne funktioniert es. Aber es muss ja auch einen weg geben das anders zu machen oder? Später wird diese Funktion von mehreren Leuten verwendet, man kann denen zwar sagen man soll die umbenennen, aber das wird wohl kaum einer jedes mal machen oder sich halt daran erinnern

  • Code
    1. $file = preg_replace("/[^0-9a-z.\-_ ]/i", "", $_GET['file']);

    Damit machst du dir deinen Dateinamen kaputt - lass dir $file an der Stelle mal ausgeben.


    Außerdem: beschäftige dich dringend mit dem Thema Behandlung von Kontextwechseln, entweder ignorierst du sie (beim Ausgeben der Dateinamen in den Link hast du sogar zwei Kontextwechsel die beide nicht behandelt werden!) oder du machst es falsch (das htmlspecialchars() in der auf das preg_replace folgende Zeile ist Käse, du hast hier keinen Kontextwechsel nach HTML).

  • Statt preg_replace würde ich nur den filename von dem eingehenden String holen.


    Wenn jemand also "../../path/to/my_file.txt" gibt,

    dann alles nach dem letzen "/".


    Bsp.:

    PHP
    1. $file = '../../path/to/my_file.txt';
    2. $filename = pathinfo($file,PATHINFO_BASENAME); // my_file.txt

    Bestimmte Zeichen verbieten ist Mist. Dann musst Du ständig hinderher sein, mit updates ... und das will keiner.

    Mit dem Filename kann nichts passieren (nichts, was ich kenne. Kann mich irren.), und Du brauchst nichts zu warten.


    EDIT: Sicherheitsproblem:

    alle vars mit htmlspecialchars() ausgeben. (EDIT: um z.B. XSS zu unterbinden. Alle Daten sind als Böse anzusehen. Auch die aus Deiner db.)

    Also

    PHP
    1. <a href="includes/downloadFile.php?file=<?php echo $ausgabeDatei ?>" type="submit" class="btn btn-info btn-fill pull-right btn-sm">Download</a>

    zu

    PHP
    1. <a href="includes/downloadFile.php?file=<?php echo htmlspecialchars($ausgabeDatei) ?>" type="submit" class="btn btn-info btn-fill pull-right btn-sm">Download</a>