Sicherer Bilder Upload mit PHP

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Wer seinen Benutzern den Upload von Bildern gestattet geht bietet eine große Angriffsfläche an. Dieses Tutorial hilft Ihnen die Gefahren zu erkennen.
    == Lösung ==

    Quellcode

    1. $imageinfo = @getimagesize($_FILES['datei']['tmp_name']);
    2. $allowed = array('image/gif', 'image/jpeg', 'image/png');
    3. if(!$imageinfo || !isset($imageinfo['mime']) || !in_array($imageinfo['mime'], $allowed)) {
    4. throw new Exception('bildformat nicht erlaubt');
    5. }
    6. $uploaddir = 'uploads/';
    7. $uploadfile = $uploaddir . basename($_FILES['datei']['name']);
    8. if (move_uploaded_file($_FILES['datei']['tmp_name'], $uploadfile)) {
    9. echo "Upload erfolgreich.";
    10. } else {
    11. echo "Upload fehlgeschlagen.";
    12. }
    Alles anzeigen


    == Erläuterungen ==
    Der Code behandelt bereits einige Sicherheitsmaßnahmen. Der Content Typ von Bildern, der mittels $_FILES['datei']['type'] übermittelt wird ist nicht sicher. Dieser lässt sich mit wenigen Handgriffen einfach manipulieren.
    Auch auf die Dateiendung kann man sich nicht verlassen - zumal sich die Prüfung durch Einsatz von Steuerzeichen wie \0 umgehen lässt.
    Durch den Aufruf von basename wird verhindert, dass man unerlaubte Sonderzeichen, wie Pfadangaben in den Dateinamen schmuggeln kann.

    == Einschränkung ==
    Das Verfahren sichert nur den Upload ab. Bietet aber weiterhin eine Angriffsfläche, falls andere Teile ihres Programmes unsicher sind.
    Hinterlegt man z.b. Kommentare direkt im Bild (mit manchen Bildbearbeitungsprogrammen ist dies möglich) - so könnte man hier Code einfügen.
    Dieser Code wird eingefügt, wenn man
    a) erlaubt die Bilder per include zu laden
    b) der Webserver die Ausführung von Dateien mit einer Bildendung an den PHP Interpreter weitergibt

    == Mehr Sicherheit ==
    Noch mehr Sicherheit erhält man eigentlich nur, indem man das Bild mit einer PHP Funktion (imagecreatefrom) selbst nochmal abspeichert.
    Dies birgt jedoch die Gefahr, dass einige Bilder zu groß für den maximal für PHP verfügbaren Arbeitsspeicher sind. Und bildet über den Performanceengpass eine weitere Angriffsfläche.

    == Literatur ==
    Mehr Informationen in englischer Sprache finden Sie unter:


    == Demo ==
    Eine Live Demo des Upload Tools und den dazugehörigen Quelltext finden Sie hier: demo.easy-coding.de/php/sicherer-bilder-upload-mit-php.

    Quellcode

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="de">
    3. <head>
    4. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    5. <title>PHP: Sicherer Bilder Upload</title>
    6. </head>
    7. <body>
    8. <?php
    9. if(isset($_FILES['datei'])) {
    10. $imageinfo = @getimagesize($_FILES['datei']['tmp_name']);
    11. $allowed = array('image/gif', 'image/jpeg', 'image/png');
    12. if(!$imageinfo || !isset($imageinfo['mime']) || !in_array($imageinfo['mime'], $allowed)) {
    13. throw new Exception('bildformat nicht erlaubt');
    14. }
    15. $uploaddir = 'uploads/';
    16. $uploadfile = $uploaddir . basename($_FILES['datei']['name']);
    17. if (move_uploaded_file($_FILES['datei']['tmp_name'], $uploadfile)) {
    18. echo "Upload erfolgreich.";
    19. } else {
    20. echo "Upload fehlgeschlagen.";
    21. }
    22. }
    23. ?>
    24. <form action="" method="post" enctype="multipart/form-data">
    25. <fieldset>
    26. <legend>Datei auswählen</legend>
    27. <input type="file" name="hiddendata" name="datei" />
    28. <input type="submit" value="Upload starten" />
    29. </fieldset
    30. </form>
    31. </body>
    32. </html>
    Alles anzeigen

    9.799 mal gelesen