Sicherer Upload mit PHP

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

  • Sicherer Upload mit PHP

    Habe hier ein aüßerst nützliches How-To gefunden..

    Quelle thegeek.de/blog/type/archiv/post/200501.html
    Autor: Marc Schieferdecker

    Wenn die Benutzer einer Webseite die Möglichkeit haben selbst etwas hochzuladen, z.B. einen Screenshot, eine PDF-Datei, oder sonstige Dateien, sollte unbedingt beachtet werden, dass die Benutzer nicht jeden Dateityp hochladen können.

    Schließlich wäre es äußerst doof, wenn ein böser Benutzer auf die Idee kommt, statt "avatar.jpg" die Datei "deleteall.php", oder "emailallfilez.php" hochzuladen. Ich denke es ist klar was gemeint ist, oder? User-Uploads dürfen nur eingeschränkt möglich sein, sonst ist der ganze Server nicht mehr sicher.

    Da der Webserver an der Endung einer Datei erkennt, wie die Datei verarbeitet werden soll, hier eine einfach Klasse, welche den Dateityp anhand der Endung ermittelt und untersucht, ob die Datei zu den erlaubten Endungen passt oder nicht.

    Quellcode

    1. <?php
    2. // Klasse zur Prüfung von Dateitypen
    3. class check_filetype
    4. {
    5. var $allowed_types;
    6. var $result;
    7. var $filename;
    8. var $filetype;
    9. // Konstruktor
    10. function check_filetype( $filename, $allowed_types )
    11. {
    12. // Set defaults
    13. $this -> allowed_types = $allowed_types;
    14. $this -> result = FALSE;
    15. $this -> filename = $filename;
    16. $this -> filetype = "";
    17. }
    18. // Files prüfen, Ergebnis Rückgabe
    19. function check()
    20. {
    21. $filetype_arr = explode( ".", $this -> filename );
    22. $this -> filetype = strtolower( end( $filetype_arr ) );
    23. foreach( $this -> allowed_types AS $type )
    24. {
    25. if( $type == $this -> filetype )
    26. {
    27. $this -> result = TRUE;
    28. break;
    29. }
    30. }
    31. return $this -> result;
    32. }
    33. }
    34. ?>
    Alles anzeigen



    Und so wird die Klasse benutzt (Beispiel: Nur Grafikdateien erlauben):

    Quellcode

    1. <?php
    2. // Objekt erzeugen und Datei prüfen
    3. $checkfile = new check_filetype( $_FILES[ "userupload" ][ "name" ], array( "jpg","png","gif" ) );
    4. if( $checkfile -> check() )
    5. {
    6. print "Datei ist okay! (Endung: {$checkfile->filetype})";
    7. }
    8. else
    9. {
    10. print "Datei ist nicht erlaubt! (Endung: {$checkfile->filetype})";
    11. }
    12. // Speicher wieder freigeben
    13. unset( $checkfile );
    14. ?>
    Alles anzeigen


    Die Funktionsweise der Klasse ist denkbar einfach: Es gibt die Eigenschaften "allowed_type" (array), "filename" (string) und "result" (boolean). Die Methode "check" überprüft die beim Erzeugen des Klassenobjekts übergebenen Werte und gibt das Ergebnis zurück. Außerdem wird die ermittelte Datei-Endung in der Eigenschaft "filetype" gespeichert.

    Ein Code-Schnipsel der hoffentlich hilft die eigene Webseite sauber und sicher zu halten. Viel Spaß damit...

    Wer es nicht objektorientiert mag, für den hier noch eine Funktion, die den selben Zweck erfüllt:

    Quellcode

    1. <?php
    2. // Files prüfen, Ergebnis Rückgabe
    3. function check( $filename, $allowed_types )
    4. {
    5. $result = FALSE;
    6. $filetype_arr = explode( ".", $filename );
    7. $filetype = strtolower( $filetype_arr[ (count( $filetype_arr ) - 1) ] );
    8. foreach( $allowed_types AS $type )
    9. {
    10. if( $type == $filetype )
    11. {
    12. $result = TRUE;
    13. break;
    14. }
    15. }
    16. return $result;
    17. }
    18. // Beispiel Aufruf
    19. $ergebnis = check( $_FILES[ "userupload" ][ "name" ], array( "jpg", "gif", "png" ) );
    20. ?>
    Alles anzeigen