Norbert: Nur jpg Bilder Upload zulassen

Nachdem ich schon Tagelang hier mitlesen, möchte ich nun auch eine Frage stellen. Ich möchte auf meiner Homepage einen Bilder Upload zulassen. Aber nur JPG. Ich habe mir das so gedacht. Zuerst überprüfe ich mittels getimagesize ob es sich um ein jpg handelt und sicherheitshalber nochmal mittels $_FILES['userfile']['type'].

Muss ich noch etwas beachten, oder ist es sicher?

Norbert

$PicturesInfo = getimagesize($_FILES['userfile']['tmp_name']);  
if (($_FILES['userfile']['type']=='image/jpeg') && ($PicturesInfo[2]==2))  
	{  
	echo 'hierbei handelt es sich um ein JPG Bild und wird abgespeichert!';  
	move_uploaded_file($_FILES['userfile']['tmp_name'], 'pictures/newpic.jpg');  
	}  
else  
	{  
	echo 'Es werden nur JPG Bilder abgespeichert!';  
	}
  1. Hi!

    Ich möchte auf meiner Homepage einen Bilder Upload zulassen. Aber nur JPG. Ich habe mir das so gedacht. Zuerst überprüfe ich mittels getimagesize ob es sich um ein jpg handelt und sicherheitshalber nochmal mittels $_FILES['userfile']['type'].

    Das Prüfen des Types in $_FILES['userfile']['type'] solltest du aus Sicherheitsgründen weglassen, denn das kann der Client beliebig füllen. Eine Inhaltsprüfung ist die einzig verlässliche. (Und selbst in den Inhalt kann man noch Mist einbauen.)

    Muss ich noch etwas beachten, oder ist es sicher?

    Zunächst solltest du prüfen, ob der Upload überhaupt geklappt hat, und dazu das Feld 'error' befragen, sonst kanst du dir die ganze Verarbeitung sparen.

    Und der Dateiname sollte geprüft oder selbst vergeben werden. Nicht dass der Client eine image.php sendet, die wie an den relevanten Stellen wie ein Bild aussieht, aber außerdem noch PHP-Code enthält. Im Upload-Verzeichnis das PHP-Parsen ganz zu verbieten, wäre auch noch eine Möglichkeit.

    Lo!

    1. Eine gute Frage!
      Ich häng mich mal dran und gebe eine Frage/Antwort.

      Hab da mal eine Image Klasse gebaut. Die stellt (wenn ein Image übergeben wurde) allerhand Funktionen bereit. Eine Funktion überprüft den Typ und erzeugt ein Imageformat mit dem man weiterarbeiten könnte:

        
      $this->arAttribute = getimagesize ( $this->strFile );  
      $this->intWidth = $this->arAttribute[0];  
      $this->intHeight = $this->arAttribute[1];  
      $this->intType = $this->arAttribute[2];  
      if($this->intType == 1)  
      {  
      	$this->imgImage = imagecreatefromgif($this->strFile);  
      } else if($this->intType == 2) {  
      	$this->imgImage = imagecreatefromjpeg($this->strFile);  
      } else if($this->intType == 3) {  
      	$this->imgImage = imagecreatefrompng($this->strFile);  
      }  
      
      

      $this->strFile ist in dem Fall das Bild.
      Meiner Ansicht nach würde $this->intType == 0 sein, wenn es sich nicht um ein jpg, png oder gif handelt. Demnach wäre $this->imgImage == null.

      Ist mein vorgehen gut?

      Gruß
      Spiegelbild eines
      T-Rex

      1. Hi!

        $this->arAttribute = getimagesize ( $this->strFile );
        $this->intType = $this->arAttribute[2];
        Meiner Ansicht nach würde $this->intType == 0 sein, wenn es sich nicht um ein jpg, png oder gif handelt.

        Nein, nicht unbedingt. getimagesize() gibt auch false zurück, wenn ihm was nicht gepasst hat. Die folgenden Array-Zugriffe liefern dann Fehler. Schau immer ins Handbuch, was eine Funktion im Fehlerfall zurückgibt und berücksichtige diesen Fall angemessen. Außerdem sind Konstanten definiert, die besser anstelle einer Zahl verwendet werden sollten, dann wird's zum einen sprechend und ist zum anderen bei (eher unwahrscheinlicher) Werteänderung immer noch richtig.

        Lo!

    2. Danke, dann müsste es so besser gehen:

        
        
      if ( is_uploaded_file ( $_FILES['userfile']['tmp_name'] ) )  
          {  
      	$NewName='test';  
      	$PicturesInfo = getimagesize($_FILES['userfile']['tmp_name']);  
      	if ($PicturesInfo[2]==2)  
      		{  
      		echo 'Dateigröße: ' . $_FILES['userfile']['size']/1024 . ' KB<br>';  
      		echo 'hierbei handelt es sich um ein JPG Bild und wird abgespeichert!';  
      		move_uploaded_file($_FILES['userfile']['tmp_name'], 'pictures/'.$NewName.'.jpg');  
      		}  
      	else  
      		{  
      		echo 'Es werden nur JPG Bilder abgespeichert!';  
      		}	  
      	}  
      else  
      	{  
      	echo 'Es fand kein upload statt!';  
      	}  
        
      
      

      Norbert

  2. Hello Norbert,

    Nachdem ich schon Tagelang hier mitlese [.],[...]

    dann hast Du hoffentlich auch den Thread ganz am Ende gelesen, der Dir ganz viele Anregungen geben sollte. Er Enthält eine durchaus nicht unwichtige Diskussion, welchen Funktionen man warum trazen/nicht treuen sollte,

    https://forum.selfhtml.org/?t=206726&m=1403954

    Und er enthält den Link auf den angefangenen WIKI-Artikel, der durchaus schon etliche abgesicherte Überlegungen zum Thema enthält.

    http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de