Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Sicheres Hochladen von Bildern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Sicheres Hochladen von Bildern

    Hallo, die nächste Frage!

    nachfolgend ein Script, um Bilder hochzuladen und zu prüfen, ob es sich wirklich um ein Bild handelt (nicht nur anhand der Dateiendung). Funktioniert alles gut. Auch Fakes mit gefälschten Dateiendungen (.*** in .jpg umbenennen) werden erkannt.

    Die Form:
    PHP-Code:
    <form enctype="multipart/form-data" action="<?php echo $_SERVER['SCRIPT_NAME']."?sid=".$sid?>" method="POST">
        <!-- Der Name des Input Felds bestimmt den Namen im $_FILES Array -->
        Diese Datei hochladen:<br /> <input name="userfile" type="file" /> 
        <input type="submit" name="los" value="Hochladen" />
    </form>
    Das empfangende Script:
    PHP-Code:
    if ($_POST['los']) {

    $uploaddir _BILDPFAD_ABS;
    $uploaddatei basename(strip_tags($_FILES['userfile']['name']));
    $uploadfile $uploaddir $uploaddatei;
    $dateiendung substr (stristr $uploaddatei'.' ), 1);

    echo 
    "Uploaddatei: ".$uploaddatei."<br />";
    echo 
    "Uploadfile: ".$uploadfile."<br />";
    echo 
    "Dateiendung: ".$dateiendung."<br />";
    echo 
    "Größe: ".$_FILES['userfile']['size']."<br />";
    echo 
    "MIMETYPE: ".$_FILES['userfile']['type']."<br />";
    echo 
    "<hr />";

    if (
    exif_imagetype($_FILES['userfile']['tmp_name']) == false) {
        echo 
    "kein Bild!!!!!<br />";
        exit;
        }
    if (
    substr_count $dateiendung'.' ) > 0) {
        echo 
    "Wahrscheinlich doppelte Dateiendung<br />";
        exit;
        }
    $endung = array("jpg""jpeg""gif""png");    
    if (!
    in_array($dateiendung,$endung)) {
        echo 
    "Keine gütige Dateiendung<br />";
        exit;
        }
    else {
    if (
    move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo 
    "Datei ist valide und wurde erfolgreich hochgeladen.\n";
        }
        else {
        echo 
    "Möglicherweise eine Dateiupload-Attacke!\n";
        }
    }

            echo 
    "<table border='1' width='80%'><tr><td>";
            echo 
    "<h3>Ergebnis Bild hochladen:</h3>";    
            echo 
    "<b>Gerade hoch geladenes Bild</b> ";
            echo 
    $uploaddatei."<br/>";
            echo 
    "<img src='"._BILDPFAD.$uploaddatei."'><br />";
            echo 
    "</td></tr></table>";
            
    // Ende if ($_POST['los']) { 
    Meine Frage - ist das sicher gegen Missbrauch?

  • #2
    Wenn du möchtest kannst du noch per $_FILES['error'] auf Upload-Fehler prüfen (Dokumentation).

    Oder, sofern erforderlich, per file_exists(), ob durch das Abspeichern eine bereits vorhandene Datei überschrieben wird. Ansonsten wird denke ich alles schon überprüft, was ein Nutzer manipulieren könnte.

    Kommentar


    • #3
      Hier wäre noch ein sehr nützlicher Link zu diesem Thema

      https://www.owasp.org/index.php/Unre...ed_File_Upload

      Kommentar


      • #4
        Hi, danke für eure Rückmeldungen!

        ich habe noch zwei Prüfungen eingebaut:
        PHP-Code:
        if (file_exists($uploadfile)) {
            echo 
        "Diese Datei gibt es schon!<br />";
            exit;
            }
        $suche "/[^0-9a-zA-Z_\.\-\@]|NULL/";
        if (
        preg_match($suche,$uploaddatei)) {
            echo 
        "Kein gülter Dateiname!";
            exit;

        Ich überlege, die Zugriffe auf das Upload-Formular zu protokollieren. Da dies im passwortgeschützten Admin-Bereich liegt, wäre es bitter ernst, wenn sich da jemand rumtreiben könnte.

        So, wenn es keine heftige Kritik mehr gibt, schließe ich dann diesem Thread in Kürze.

        Kommentar

        Lädt...
        X