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

  • Versuch mal den Namen zu ändern.

    Sonderzeichen um Umlaute im Link sind nicht so der Hit.

    Wenn die Dateien im gleichen Ordne sind , dann weiß ich jetzt auch nicht weiter.


    EDIT:

    Wenn ich das ö in oe tausche geht es bei mir

  • 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
    $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
    $file = '../../path/to/my_file.txt';
    $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
    <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
    <a href="includes/downloadFile.php?file=<?php echo htmlspecialchars($ausgabeDatei) ?>" type="submit" class="btn btn-info btn-fill pull-right btn-sm">Download</a>
  • Hey,

    Wenn eine URL z.B. im href-Attribut eines a-Elements ausgegeben wird. Für URLs gelten spezielle Regeln, nicht alle Zeichen sind da erlaubt, siehe Fortsetzung zu der von mir in #4 verlinkten Seite.

    danke für deine Antwort auf meine Frage und für den Link zur Selfhtml Seite, in der es nochmals ausführlicher erklärt wird :)


    Schöne Grüße,
    Stef

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!