Sicherer Bilder Upload mit PHP

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • 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 ==

    Source Code

    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. }
    Display All


    == 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.

    Source Code

    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>
    Display All

    6,549 times viewed