Ergebnis 1 bis 9 von 9
  1. #1
    j-l-n Guest

    [PHP] Uploadverarbeitung mit Größenbegrenzung und Umbenennung

    Heute möchte ich euch mal ein Upload-Skript von mir zeigen. Dieses hat einige Funktionen, wie Beschränkung der maximalen Upload-Größe, Umbenenung der Datei und Anzeige eines Downloadlinks.
    Als HTML-Seite dient ein ganz normales, unformatiertes Formular:
    HTML-Code:
    <form action="process-upload.php" method="post" enctype="multipart/form-data" id="upload">
    	<input type="file" name="datei"/>
    <br><br><br>
    	<input type="submit" value="Datei hochladen"/>
    </form>
    Dieses übergibt die Datei an das eigentliche PHP-Skript, das hier mit Kommentaren folgt:

    PHP-Code:
    <?php

    // (C) 2013 by Julian (http://forum.jswelt.de/members/Julian.html)
    //das Skript darf nur mit diesem Hinweis verwendet werden!!!

    if(isset($_FILES['datei']['name'])) // nur ausführen, wenn eine Datei ausgewählt ist
    {

    $max_filesize_mb 50// maximale Dateigröße in MB, zur Anzeige
    $max_filesize $max_filesize_mb 1024 1024// zur Verarbeitung durch das Skript - danke an kkapsner

    if($_FILES['datei']['size'] < $max_filesize// wenn Datei unter Größen-Limit und vorhanden
    {

        
    $id md5(uniqid()); // zufällige Zeichenfolge für unterschiedliche Dateinamen erzeugen (durch MD5-Hash der uniqueID)

        // Name der hochgeladenen Datei in Kleinbuchstaben als Variable festlegen
        
    $DateiName str_replace(' ','-',strtolower($_FILES['datei']['name'])); 

        
    // Dateierweiterung durch Suchen des letzten Punktes im Dateinamen erhalten
        
    $DateiExt substr($DateiNamestrrpos($DateiName'.'));
          
    $DateiExt str_replace('.','',strtolower($DateiExt));

    //Prüfung auf Sicherheitsrisiko durch PHP-Datei oder .htaccess
    if ($DateiExt == "php" || $DateiExt == "htaccess" || $DateiExt == "php4" || $DateiExt == "php5" ) {
    echo
    '<h3>Der Dateityp ist nicht erlaubt.</h3>';
    exit;
    }
        
        
    // Dateierweiterung vorrübergehend löschen, um die oben erzeugte Zeichenfolge an den Dateinamen anzuhängen
        
    $DateiName         preg_replace("/\\.[^.\\s]{3,4}$/"""$DateiName); 
        
        
    // Neuen Dateinamen aus Name + zufällige Zeichenfolge + Erweiterung (so können auch Dateien des gleichen Namens hochgeladen werden)
        
    $NewDateiName $DateiName.'_'.$id.'.'.$DateiExt;


        
    $ziel='uploaded-files'."\\".$NewDateiName// Zielverzeichnis festlegen (uploaded-files) und bei Verschiebung Umbenennung

            
        
    $temp_datei $_FILES['datei']['tmp_name']; // nicht verändern!!!

        
    move_uploaded_file($temp_datei,$ziel); // Hochgeladene Datei aus temp-Ordner in Zielordner verschieben

    // Meldung ausgeben, wenn Datei hochgeladen. Diese enthält den Downloadlink

        
    echo"<h4>'{$_FILES['datei']['name']}' wurde erfolgreich hochgeladen.<br>Downloadlink: <a href='http://hiereureseite//uploaded-files/$NewDateiName' title='$NewDateiName' target='_blank'>http://hiereureseite/uploaded-files/$NewDateiName</a></h4>";

    }

    else 
    // wenn Datei größer als erlaubt, Fehler anzeigen und oben in $max_file_size_mb erlaubte Größe
    {    

        echo
    "<h3>&nbsp;FEHLER: &nbsp;&nbsp;Die Datei ist zu gro&szlig;. (max. ".$max_filesize_mb." MB)</h3>";

    }
    }

    else 
    // wenn keine Datei mitgesendet, Fehler anzeigen
    {
        echo
    "<br><br><h3>&nbsp;FEHLER: &nbsp;&nbsp;Es ist keine Datei ausgew&auml;hlt.</h3>";
    }

    exit();
    ?>
    Geändert von j-l-n (21-02-2014 um 07:46 Uhr) Grund: Funktionserweiterung

  2. #2
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.757

    AW: [PHP] Uploadverarbeitung mit Größenbegrenzung und Umbenennung

    Naja... wenn du das irgendwo wirklich produktiv einsetzt, hast du da ein massives Sicherheitsloch.

    PS: So wirklich schwer ist es nicht, MB in B umzurechnen...
    Code:
    $max_filesize_mb = 50
    $max_filesize = $max_filesize_mb * 1024 * 1024;
    PPS: Mögliche Fehler, die beim move_uploaded_file oder schon vorher auftreten ($_FILES['datei']['error']), werden nicht aufgefangen. Das sollte man schon machen.

    PPPS: Zusätzlich ist das HTML, das deine process-upload.php erzeugt, invalide.

  3. #3
    j-l-n Guest

    AW: [PHP] Uploadverarbeitung mit Größenbegrenzung und Umbenennung

    Zitat Zitat von kkapsner Beitrag anzeigen
    So wirklich schwer ist es nicht, MB in B umzurechnen...
    Code:
    $max_filesize_mb = 50
    $max_filesize = $max_filesize_mb * 1024 * 1024;
    Ja, das geht natürlich einfacher. Ist sogar übersichtlicher und man muss die Größe nur an einer und nicht zwei Stellen definieren. Änder ich gleich.

    Zitat Zitat von kkapsner Beitrag anzeigen
    Mögliche Fehler, die beim move_uploaded_file oder schon vorher auftreten ($_FILES['datei']['error']), werden nicht aufgefangen.
    Bei "vorher" geb ich dir Recht. Aber welcher Fehler soll bei move_uploaded_file auftreten, außer dass das Verzeichnis nicht existiert?

    Zitat Zitat von kkapsner Beitrag anzeigen
    Zusätzlich ist das HTML, das deine process-upload.php erzeugt, invalide.
    Inwiefern? Wäre dankbar für Hinweis, an welcher Stelle.

    Zitat Zitat von kkapsner Beitrag anzeigen
    Naja... wenn du das irgendwo wirklich produktiv einsetzt, hast du da ein massives Sicherheitsloch.
    Das versteh ich jetzt allerdings überhaupt nicht. Gut, dass bewusst alle Dateitypen erlaubt sind, mag gewiss ein Risiko sein, aber ein massives Sicherheitsloch? Das wirkliche Risiko hab ich jetzt - danke - behoben, nämlich PHP-Dateien, die auf dem Server Schaden anrichten können, sind jetzt nicht erlaubt.

  4. #4
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.757

    AW: [PHP] Uploadverarbeitung mit Größenbegrenzung und Umbenennung

    Zitat Zitat von EG-net Beitrag anzeigen
    Bei "vorher" geb ich dir Recht. Aber welcher Fehler soll bei move_uploaded_file auftreten, außer dass das Verzeichnis nicht existiert?
    Die hochgeladene Datei könnte irgendwie nicht valide sein (wie auch immer). Auf jeden Fall lifert mover_uploader_file ein false zurück, wenn irgendwas schief lief. Das kann man doch verwenden.

    Zitat Zitat von EG-net Beitrag anzeigen
    Inwiefern? Wäre dankbar für Hinweis, an welcher Stelle.
    Schon das Grundgerüst ist nicht vorhanden. Keine DocType, kein <html>, ...


    Zitat Zitat von EG-net Beitrag anzeigen
    Das versteh ich jetzt allerdings überhaupt nicht. Gut, dass bewusst alle Dateitypen erlaubt sind, mag gewiss ein Risiko sein, aber ein massives Sicherheitsloch? Das wirkliche Risiko hab ich jetzt - danke - behoben, nämlich PHP-Dateien, die auf dem Server Schaden anrichten können, sind jetzt nicht erlaubt.
    Ich kann immer noch PHP-Dateien hochladen... ".PHP"...
    Außerdem kann ich eine ".htaccess" hochladen, die mir das Ausführen von ".sow" im PHP-Interpreter erlaubt...

    Auch ist nicht sicher, dass $DateiName auch wirklich einen validen Dateinamen enthält. Alles was vom Nutzer kommt muss validiert und "sanitiert" werden.

  5. #5
    j-l-n Guest

    AW: [PHP] Uploadverarbeitung mit Größenbegrenzung und Umbenennung

    Zitat Zitat von kkapsner Beitrag anzeigen
    Schon das Grundgerüst ist nicht vorhanden. Keine DocType, kein <html>, ...
    Gut, das war allerdings sozusagen auch "Absicht", da ich nur das Skript an sich dargestellt habe. Den typischen Aufbau einer HTML-Seite kann ja jeder selbst erstellen.
    (Genauso habe ich ja auch nur diesen Teil des Formulars
    Code:
    <form action="process-upload.php" method="post" enctype="multipart/form-data" id="upload">
    	<input type="file" name="datei"/>
    <br><br><br>
    	<input type="submit" value="Datei hochladen"/>
    </form>
    dargestellt. Es wäre halt ein bisschen weniger übersichtlich gewesen, extra auch noch den <title> zu definieren, einen <style>einzubinden, und, und, und...)


    Zitat Zitat von kkapsner Beitrag anzeigen
    Ich kann immer noch PHP-Dateien hochladen... ".PHP"...
    Außerdem kann ich eine ".htaccess" hochladen, die mir das Ausführen von ".sow" im PHP-Interpreter erlaubt...
    Das hatte ich mir schon gedacht, als ich es hinzugefügt habe. Eine effektivere Sicherung muss natürlich noch mehr berücksichtigen (habe ich jetzt erweitert, siehe oben).

  6. #6
    j-l-n Guest

    AW: [PHP] Uploadverarbeitung mit Größenbegrenzung und Umbenennung

    Neu: Sicherheitsprüfung, ob die Datei eine PHP-Datei oder .htaccess ist, die schädlichen Code auf dem Server ausführen könnte.

    PHP-Code:
    $DateiExt str_replace('.','',strtolower($DateiExt)); // Dateierweiterung wird zusätzlich zu Kleinbuchstaben konvertiert, sodass das Verbot z.B. auch bei .pHp funktioniert
    if ($DateiExt == "php" || $DateiExt == "htaccess" || $DateiExt == "php4" || $DateiExt == "php5" ) { //Verbotene Dateitypen - weitere mit || getrennt einfach anfügen
    echo'<h3>Der Dateityp ist nicht erlaubt.</h3>';
    exit;

    Dies ist natürlich für einen Hacker keine ausreichende Hürde, da z.B. auch .php3-Dateien teilweise als PHP ausgeführt werden.
    Aber wenn man kein lohnenswertes Ziel für Hacker abgibt, genügt diese Sicherheitsprüfung eigentlich.

  7. #7
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.757

    AW: [PHP] Uploadverarbeitung mit Größenbegrenzung und Umbenennung

    Deine exits im Code machen aber den Einbau der fehlenden HTML-Codes recht unübersichtlich/mühsam...

    Ich würde bei den Dateiendungen ja mit einer Whitelist arbeiten. Wenn der Nutzer unbedingt irgendwas Abgefahrenes hochladen will, kann er's ja in ein .zip packen...

    (... oder man verbietet nur leere Dateinamen und stellt im Server ein, dass prinzipiell keine Datei in diesem Ortner interpretiert/ausgeführt werden soll.)

  8. #8
    j-l-n Guest

    AW: [PHP] Uploadverarbeitung mit Größenbegrenzung und Umbenennung

    Zitat Zitat von kkapsner Beitrag anzeigen
    Deine exits im Code machen aber den Einbau der fehlenden HTML-Codes recht unübersichtlich/mühsam...

    ... oder man verbietet nur leere Dateinamen und stellt im Server ein, dass prinzipiell keine Datei in diesem Ortner interpretiert/ausgeführt werden soll.
    Ja, so würde ichs jetzt dann machen. Habe mich bewusst dazu entschieden, dass der Nutzer eigentlich jede Datei hochladen kann. (Ist natürlich wie von dir angemerkt problematisch)

  9. #9
    j-l-n Guest

    AW: [PHP] Uploadverarbeitung mit Größenbegrenzung und Umbenennung

    UPDATE: Man sollte am besten per Eintrag in einer .htaccess
    Code:
    Option -ExecCGI
    RemoveHandler .php
    noch die Ausführung von Skripten im Upload-Verzeichnis abschalten. So können böswillige Nutzer zwar ausführbaren Code hoch- und runterladen, aber eben nicht ausführen...

    (Anregung von kkapsner)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •