Sicherheit bei Bild upload

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sicherheit bei Bild upload

    Volgendes problem, ich habe bei meinem Forum, wie bei allen Foren das ja so ist ein Avatar upload.
    Nur ist uns aufgefallen, das man dort auch pics hochladen kann in den Bösartiger Code versteckt ist.
    Wie kann man so eine Prüfung einbauen ob das pic (.gif, .jpg, .png) auch wirklich ein pic ist?

    Hier mal der code der Datei:
    PHP Code:
    <?php
    if ($USER['id']!='' && $USER['id']!=0) {
     include_once(
    "login/inc.nav_user.php");
     if (isset(
    $_POST['action'])) $ACTION=$_POST['action'];
     else 
    $ACTION='view';

     if (
    $config['avatar_eod']!=&& $config['avatar_eod']!=2) {header 
    ("location: include.php?event=23&PHPKITSID=".session_id()); exit();}
     elseif (
    $ACTION==$_POST['cancel']) 
    {
    header("location: include.php?path=login/getavatar.php&PHPKITSID=".session_id()); exit();}
     elseif (isset(
    $_REQUEST['upload'])) {
      if(
    $ACTION==$_POST['upload_action'] && is_uploaded_file($_FILES['upload_pic']['tmp_name'])) {
       if (!
    $avatar_size=getimagesize($_FILES['upload_pic']['tmp_name'])) unset($avatar_size);
       else {
        if (
    $avatar_size[2]==1$ext='.gif';
        elseif (
    $avatar_size[2]==2$ext='.jpg';
        elseif (
    $avatar_size[2]==3$ext='.png';
        else unset(
    $ext);
        }

       if (isset(
    $ext) && isset($avatar_size)) {
        
    $filesize=$_FILES['upload_pic']['size'];
        
    $filename='avauser_'.$USER['id'].$ext;;

        if ((
    $config['avatar_height']<$avatar_size[1]) || ($config['avatar_width']<$avatar_size[0])) $error=1;
        elseif(
    $filesize<($config['avatar_size']*1024) && $filesize!=0) {
         
    $UPLOAD=new UPLOAD();
         
    $uploadreturned=$UPLOAD->images($_FILES['upload_pic'],$config['avatar_path'],$filename);
         if (
    $uploadreturned[0]==TRUE) {
          
    header("location: include.php?path=login/extoption.php&setavatar=".$filename."&PHPKITSID=".session_id()); exit();
          }
         else 
    $error=4;
         }
        else 
    $error=2;
        }
       else 
    $error=3;

       
    header("location: include.php?path=login/getavatar.php&upload&error=".$error."&PHPKITSID=".session_id()); exit();
       } 
      else {
       if (isset(
    $_REQUEST['error'])) $error=$_REQUEST['error'];
       if (
    $error==1) eval ("\$avatar_message= \"".getTemplate("getavatar_upload_error1")."\";");
       elseif (
    $error==2) eval ("\$avatar_message= \"".getTemplate("getavatar_upload_error2")."\";");
       elseif (
    $error==3) eval ("\$avatar_message= \"".getTemplate("getavatar_upload_error3")."\";");
       else eval (
    "\$avatar_message= \"".getTemplate("getavatar_upload_message")."\";");
       eval (
    "\$site_body.= \"".getTemplate("getavatar_upload")."\";");
       } 
      }
     else {
      
    $dir=$config['avatar_path'];
      
    $width=1;
      
    $row='odd';
      
    $a=opendir($dir);

      while (
    $datei=readdir($a)) {
       if (
    strstr($datei,"avatar") || ($USER['status']=='member' && strstr($datei,"avamember")) ||
    (
    $USER['status']=='mod' && (strstr($datei,"avamod") || strstr($datei,"avamember"))) || ($USER['status']=='admin' &&
    (
    strstr($datei,"avaadmin") || strstr($datei,"avamod") ||
    strstr($datei,"avamember")))) {
        if (
    $width==4) {
         eval (
    "\$avatar_list.= \"".getTemplate("getavatar_rowbreak")."\";");
         
    $width=1;
         
    $row=rowcolor($row);
         }
        if (!
    $avatar_dimension=@getimagesize($dir."/".$datei)) unset($avatar_dimension);
        eval (
    "\$avatar_list.= \"".getTemplate("getavatar_list")."\";");
        
    $width++;
        }
       }
      
    $cs=4-$width;
      if (
    $cs>0) eval ("\$avatar_list.= \"".getTemplate("getavatar_lastrow")."\";");
      
    closedir($a);

      if (
    $config['avatar_eod']==2) eval ("\$avatar_uploadlink= \"".getTemplate("getavatar_uploadlink")."\";");
      eval (
    "\$site_body.= \"".getTemplate("getavatar")."\";");
      }
     }
    else {
    header("location: include.php?event=1&PHPKITSID=".session_id()); exit();}
    ?>
    Last edited by Musel; 04-07-2006, 11:17.

  • #2
    Ob ein Bild ein Bild ist, kannst du mit der von dir bereits verwendeten Funktion getimagesize prüfen.

    Ob das Bild als solches "böse" ist, sprich einen buffer overflow provoziert, ...: keine Chance (soweit ich weiß), aber dafür gibt's ja Fixes seitens der Browserhersteller


    P.S.
    Brich bitte deinen Beitrag so um, dass man nicht nach rechts scrollen muss (sonst mach ich das )
    Ich denke, also bin ich. - Einige sind trotzdem...

    Comment

    Working...
    X