Fragen zu Dateiupload / Dateitypen

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

  • Fragen zu Dateiupload / Dateitypen

    Hallo PHPler,

    ich habe mir heute ein kleines Dateiuploadscript geschrieben und hab dazu ein paar Fragen.

    - 1. Wie kann ich festlegen das nur nur bestimmte Dateitypen bzw Dateien mit speziellen Endungen (z.B. .jpg .png) gespeichert werden.
    - 2. Wie löse ich das Problem mit gleichen Dateinamen? (neuere Dateien überschreiben Alte mit dem selben Namen)

    Vielen dank schon mal für eure Antworten

    PHP-Code:
    <?php

    // Prüfen des Arrays $_FILES;

    if (isset($_FILES["datei"]))
       {
       
    //Upload-Status
       
    if ($_FILES["datei"]["error"] == UPLOAD_ERR_OK)
             {
             
    //Muster zur Überprüfung der im Dateinnamen enthaltenen Zeichen (Optional)
             
    $regEXP "/^[a-z_]([a-z0-9_-]*\.?[a-z0-9_-])*\.[a-z]{3,4}$/i";
             
             
    //Überprüfen von Dateinname und Dateigröße
             
    if (preg_match($regEXP$_FILES["datei"]["name"]) && $_FILES["datei"]["size"] > && $_FILES["datei"]["size"] < 10000000)
                  {
                  
    //Temporäre Datei in das Zielverzeichnis des Servers verschieben
                  
    move_uploaded_file($_FILES["datei"]["tmp_name"], "user_files/" .$_FILES["datei"]["name"]);
                   
                   
    //Namen speichern für spätere Übergabe für Bildausgabe
                   
    $dname $_FILES["datei"]["name"];
                   
                   
    //zusätzliche Infos in Arraysaufteilen
                   
    $dtype $_FILES["datei"]["type"];
                   
    $dsize $_FILES["datei"]["size"];
                   
                   
                   
    //Redirect zur Erfolgsmeldung + Dateinamenübergabe via Get
                   
    header("Location: datei_upload_status.php?dateiname=user_files/$dname&dtype=$dtype&dsize=$dsize Byte");              
                  }
          else
                {
                echo 
    "<h1><center>Fehler im Dateinamen oder in der Dateigröße -> Limit: <u>10000 kb</u> !</center>";
                }
          
             }
           else 
                {
                echo 
    "<h1><center>Fehler bei der Übertragung !</center>";
                }       
       }
    else
        {
        echo 
    "<h1><center>Dateiupload Fehlgeschlagen</center>";
        }


    ?>
    Der die das, wer wie was, wieso weshalb warum
    ..... wer nicht fragt bleibt dumm.

  • #2
    1. Wie kann ich festlegen das nur nur bestimmte Dateitypen bzw Dateien mit speziellen Endungen (z.B. .jpg .png) gespeichert werden.
    per substr und bei bildern zusätzlich mit getimagesize
    2. Wie löse ich das Problem mit gleichen Dateinamen? (neuere Dateien überschreiben Alte mit dem selben Namen)
    per file_exists prüfen und ggf. alte datei mit unlink löschen.

    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Zu 1:
      per substr und bei bildern zusätzlich mit getimagesize
      Vielen Dank. Das is die Lösung die ich gesucht habe.

      Zu 2:
      per file_exists prüfen und ggf. alte datei mit unlink löschen.
      Ist zwar nicht ganz genau das was ich wollte hat mich aber auf die Idee gebracht vor dem Dateinamen einfach nen Unixzeitstempel vorne dranzuhängen.

      Also auch hier noch mal thx.
      Der die das, wer wie was, wieso weshalb warum
      ..... wer nicht fragt bleibt dumm.

      Kommentar


      • #4
        Vielen Dank. Das is die Lösung die ich gesucht habe.
        Aber das getimagesize nicht vergessen, sonst kann man dir Schadcode unterjubeln!
        Ist zwar nicht ganz genau das was ich wollte hat mich aber auf die Idee gebracht vor dem Dateinamen einfach nen Unixzeitstempel vorne dranzuhängen.
        Auch 'ne Möglichkeit.

        Peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Hab meinen Code jetzt geändert mit "Getimagesize, time(), sowie substr()".

          Allerdings hab ich jetzt eine Frage bezüglich der Dateienden Überprüfung.
          Ich habe jetzt alle meinen zulässigen Dateitypendungen in ein Array gepackt.
          Wie kann ich jetzt die Werte im Array am besten mit dem Dateinamen vergleichen ohne das ich jedes Arrayelement mit einem extra
          "&& $dendung == $dendung_pruef[0] || $dendung == $dendung_pruef[1] etc..."
          einzeln abprüfe.

          PS: Das PHP-Handbuch funktioniert grad irgendwie nicht mehr.

          Hier jedenfalls der neue Codeteil:

          PHP-Code:
                   //Dateiendungen sowie Imagesize() überprüfen
                   
          $dendung substr($_FILES["datei"]["name"],-4);
                   
          $dendung_pruef = array(".jpg"".gif""jpeg"".png");
                   
          $dbildinfo getimagesize ($_FILES["datei"]["tmp_name"]);
                   
                   
          //Überprüfen von Dateinname und Dateigröße
                   
          if (preg_match($regEXP$_FILES["datei"]["name"]) && $_FILES["datei"]["size"] > && $_FILES["datei"]["size"] < 10000000 && $dbildinfo && $dendung == "!!!Hier sollten die Endungen geprüft werden!!!")
                        {
                        
                         
          //vor den Dateinamen Unixzeitstempel hinzufügen für zuspeichernden Dateinamen.
                                       
                         
          $dname time() ." " .$_FILES["datei"]["name"];
                         
                         
                        
          //Temporäre Datei in das Zielverzeichnis des Servers verschieben
                        
          move_uploaded_file($_FILES["datei"]["tmp_name"], "user_files/" .$dname); 
          Der die das, wer wie was, wieso weshalb warum
          ..... wer nicht fragt bleibt dumm.

          Kommentar


          • #6
            Dateiendung isolieren, und dann in_array() verwenden.

            Dass eine Datei, die vom Client kommt, jede beliebige Endung haben kann (oder auch gar keine), ist hoffentlich klar.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Stimmt... in_array.. hätt ich auch drauf kommen können.

              Das ich Dateien jegmögliche Dateiendung geben kann obwohls ne andere Datei ist ist mir klar.

              Obs wirklich ein Bild ist überprüft ja im Prinzip ja sowieso Imagesize().

              Das mit den Dateiendungen soll eigentlich nur deswegen sein weil diese Dateitypen in meinem Fall wünschenswert sind, aber nicht zwingend erforderlich. (wenn dann später was nicht richtig funktioniert weils der falsche Bilddateityp ist, solls das Problem der Benutzer sein. nicht meins )

              Damit sind meine Fragen auch schon wieder alle beantwortet für heute.

              Nochmals vielen Dank.

              Der die das, wer wie was, wieso weshalb warum
              ..... wer nicht fragt bleibt dumm.

              Kommentar


              • #8
                schau dir auf jeden fall mal dieses tutorial an. besonders die abschnitte datei-uploads. das ist zwar noch nicht alles, aber du hast die prinzipien von diversen attacken gelernt. auch wenn es da noch andere möglichkeiten (auch bei bildern) gibt.

                peter
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar


                • #9
                  Hab mir das Tutorial mal angesehen und festgestellt, dass das eigentlich kein Problem sein sollte, da ich in keiner anderen Seite mit get arbeite und im Regelfall alle Übertragungen bei mir mit Rijaendel verschlüsselt werden.

                  Jetzt noch zur Ausgabe selber:
                  Ich geb nach erfolggreichem Upload und Speicherung der Datei noch die URL und das Bild selber aus mit htmlcode.
                  Giebts da auch noch ne Möglichkeit das dadurch Unfug entsteht ?


                  <p><font face="arial, helvetica, sans-serif" size="5"><a href="domain/TEST/<?php echo $dname; ?>">domain/TEST/<?php echo $dname; ?></a></font>

                  <p><img src="<?php echo $dname;?>" ></p>
                  Der die das, wer wie was, wieso weshalb warum
                  ..... wer nicht fragt bleibt dumm.

                  Kommentar


                  • #10
                    Zitat von Maanee9 Beitrag anzeigen
                    Ich geb nach erfolggreichem Upload und Speicherung der Datei noch die URL und das Bild selber aus mit htmlcode.
                    Giebts da auch noch ne Möglichkeit das dadurch Unfug entsteht ?
                    Natürlich, schliesslich hast du den vom Client übergebenen Dateinamen übernommen.
                    Ob das schon beim Verschieben der hochgeladenen Datei gefährlich werden kann, weiss ich gerade nicht - k.A., ob PHP da wenigstens sowas wie ../ schon rausfiltern würde.
                    Bei der Ausgabe als URL-Bestandteil dann auf jeden Fall - da muss noch eine kontextgerechte Kodierung mit rein.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Ok.. das mir evtl sogar der Dateiname schon Probleme machen könnte hab ich nicht gewusst.

                      Hab das jetzt mal so gelöst mit dem Dateinamen:
                      (Damit sollte eigentlich alles aus Dateinamen draußen sein was nicht rein soll oder ?)



                      PHP-Code:
                                     //Html- und PHP-Code entfernen
                                     
                      $dname strip_tags($dname);
                                     
                      //Umlaute und Sonderzeichen in HTML-Schreibeweise umwandeln
                                     
                      $dname htmlentities($dname);
                                     
                      //Leerzeichen am Ende und Anfang Entfernen
                                     
                      $dname trim($dname);
                                     
                      //Backslashes entfernen
                                     
                      $dname stripslashes($dname); 
                      Der die das, wer wie was, wieso weshalb warum
                      ..... wer nicht fragt bleibt dumm.

                      Kommentar


                      • #12
                        Du versucht zu ermitteln, was böse ist und das zu entfernen (Blacklisting). In solch einem Fall solltest du aber sagen, was ok ist, und nichts anderes gestatten (Whitelisting). Ein Pattern, das nur Zahlen, Buchstaben, Punkte und Bindestriche zulässt wäre zum Beispiel ein Anfang. Der Rest wird einfach weggeschmissen.
                        [FONT="Helvetica"]twitter.com/unset[/FONT]

                        Shitstorm Podcast – Wöchentliches Auskotzen

                        Kommentar


                        • #13
                          Ok. Dann mach ich das auf die Whitlisting Art.

                          Damit sollte dann eigenlich eine Relativ gute Prävention da sein damit ich mich wieder anderen Sachen widmen kann.

                          Der die das, wer wie was, wieso weshalb warum
                          ..... wer nicht fragt bleibt dumm.

                          Kommentar


                          • #14
                            Zitat von Maanee9 Beitrag anzeigen
                            Ok.. das mir evtl sogar der Dateiname schon Probleme machen könnte hab ich nicht gewusst.

                            Hab das jetzt mal so gelöst mit dem Dateinamen:
                            (Damit sollte eigentlich alles aus Dateinamen draußen sein was nicht rein soll oder ?)
                            ...
                            Schau dir mal basename() an, wenn das PHP-Handbuch wieder funktioniert.

                            Ein passender regulärer Ausdruck tuts aber auch, eigentlich noch etwas besser als basename():
                            PHP-Code:
                            // returns an empty string '' for invalid paths
                            $basename preg_replace('/\A.*?(?!\.+)([^\/\x5c]*)\z/s''$1'$path); 
                            HTML-Encoding sollte man nur anwenden, wenn der String auch im HTML-Kontext ausgegeben werden soll. Da Dateinamen auch Leerzeichen enthalten dürfen (unter Windoze bspw. seit VFAT16 so ca. seit 1996, andere Betriebs-/Filesysteme können das schon seit den frühen 1980-ern), würde ich auf trim() verzichten. Aber das ist Ansichtssache.

                            Für stripslashes() kenne ich nur eine vernünftige Anwendung: In die Tonne treten. Das Gleiche gilt für strip_tags(). PHP bietet eine Menge an unsinnigen Funktionen an, aber nur weil sie da sind, muss man sie nicht in eigene Scripts einbauen.
                            Zuletzt geändert von fireweasel; 24.06.2009, 22:53.
                            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                            Kommentar

                            Lädt...
                            X