2009-10-23 8 views
1

Bonjour, j'essaie de télécharger une image en utilisant un script PHP. Et ce qui est vraiment bizarre est que je reçois l'erreur suivante dans Internet Explorer fonctionne partout ailleurs scénario bien:Problèmes de téléchargement de fichiers en PHP

Warning: move_uploaded_file(pictures/) [function.move-uploaded-file]: failed to open stream: Is a directory in /home/tntauto1/public_html/admin_add1.php on line 59 

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpcJnHZE' to 'pictures/' in /home/tntauto1/public_html/admin_add1.php on line 59 

Warning: copy() [function.copy]: The first argument to copy() function cannot be a directory in /home/tntauto1/public_html/admin_add1.php on line 60 

Voici le script:

if(is_uploaded_file($_FILES['image']['tmp_name'])){ 
    if($_FILES['image']['type'] == 'image/jpeg'){ 
     $original = 'original_'.$v_id.'.jpg'; 
     $large = 'large_'.$v_id.'.jpg'; 
     $small = 'small_'.$v_id.'.jpg'; 

    }elseif($_FILES['image']['type'] == 'image/gif'){ 
     $original = 'original_'.$v_id.'.gif'; 
     $large = 'large_'.$v_id.'.gif'; 
     $small = 'small_'.$v_id.'.gif'; 
    }else{ 
     $error = 'Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format.'; 
    } 
    if(move_uploaded_file($_FILES['image']['tmp_name'],'pictures/'.$large)){} 
     copy('pictures/'.$large,'pictures/'.$small); 

    $imgsize = getimagesize('pictures/'.$large); //>>>>>>>>>>>>>>>>>>>>>>>>>>>>---- Resize to 480 X 360 
    $width = $imgsize[0]; 
    $height = $imgsize[1]; 
    if(($width > 480) || ($height > 360)){//resize the image 
     $ratio = $width/$height; 
     if(100/$ratio >= 80){//calculates if height of uploaded image is too large 
      $new_width = floor(360 * $ratio); 
      $new_height = 360; 
     }elseif(150 * $ratio > 100){// calculate if width of uploaded image is too large 
      $new_width = 480; 
      $new_height = floor(480/$ratio); 
     } 
     if($_FILES['image']['type'] == 'image/jpeg'){ 
      $img = imagecreatefromjpeg('pictures/'.$large); 
      $img_copy = imagecreatetruecolor($new_width,$new_height); 
      imagecopyresampled($img_copy,$img,0,0,0,0,$new_width,$new_height,$width,$height); 
      imagejpeg($img_copy,'pictures/'.$large,100);  
     } 
     if($_FILES['image']['type'] == 'image/gif'){ 
      $img = imagecreatefromjpeg('pictures/'.$large); 
      $img_copy = imagecreatetruecolor($new_width,$new_height); 
      imagecopyresampled($img_copy,$img,0,0,0,0,$new_width,$new_height,$width,$height); 
      imagejpeg($img_copy,'pictures/'.$large,100);  
     } 
    } 
+0

Bonjour à tous pour votre contribution. Ne pas le vérifier par le type de fichier $ _FILES ['nom'] ['type'] l'a corrigé. (désolé je n'ai pas mentionné $ grande variable est définie plus tôt dans le script que je n'ai pas posté) – Ross

Répondre

6
if($_FILES['image']['type'] == 'image/jpeg'){ 

Ne comptez jamais sur le type MIME soumis par le navigateur.

Dans ce cas, votre problème est que David fait allusion à: IE habituellement (à tort) fournit image/pjpeg pour les fichiers JPEG, de sorte que vous êtes la détection d'un type de fichier inconnu et erreur de réglage $ à Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format. ... mais malgré que vous essayez encore déplacez le fichier de toute façon, même si vous n'avez pas défini $ small ou $ large.

Mais plus que cela, le type soumis par le navigateur est susceptible d'être complètement faux. Vous ne pouvez pas croire que le nom de fichier ou le type de média téléchargé est approprié, alors ne prenez même pas la peine de les vérifier. Au lieu de cela, regardez $imgsize[2] après votre appel à getimagesize pour savoir quel type PHP pense que l'image est.

Et ... si vous acceptez les téléchargements d'images par les utilisateurs en général, vous avez un problème de sécurité. Il est parfaitement possible de créer un fichier GIF valide (ou un autre type de fichier) contenant des balises HTML. Puis, quand IE-sanglant arrive pour accéder au GIF comme une page à part, il détecte les balises HTML, décide du type de contenu que vous avez dit qu'il doit être faux, et l'interprète comme une page HTML à la place, y compris JavaScript là-dedans, qui s'exécute ensuite dans le contexte de sécurité de votre site. Si vous devez autoriser le téléchargement de fichiers à partir d'une source non fiable et que vous ne traitez pas les images vous-même (ce qui aurait normalement pour effet secondaire de supprimer le code HTML indésirable), vous devez généralement diffuser vos images depuis un autre nom d'hôte pour éviter les scripts sur votre site.

+0

Je ne savais pas que vous pouviez intégrer du HTML dans les images. Comment on ferait ça? Plus important encore, comment détecter que l'image téléchargée contient des balises HTML et traiter en conséquence? – akinuri

+0

Voici un exemple amusant: http://lcamtuf.coredump.cx/squirrel/. Essayer de détecter des balises dans des fichiers arbitraires est une approche plutôt condamnable, car vous devez utiliser les mêmes heuristiques que les navigateurs, qui sont variables et non documentés.Au lieu de cela, comme ci-dessus, servez votre contenu d'utilisateur à partir d'un nom d'hôte différent de sorte que s'il obtient XSS cela ne lui donne pas le contrôle de votre site principal. – bobince

+0

Très intéressant. Je peux voir les balises HTML lorsque j'inspecte le fichier image. Certains suggèrent de créer une nouvelle image à partir de l'image téléchargée pour supprimer le code HTML et les scripts possibles dans le fichier et/ou dans les métadonnées. Cela fonctionnerait-il? Je pense à poster une question à ce sujet concernant mon cas particulier. – akinuri

0

Vous ne pouvez pas déplacer un répertoire, car $ grand n'a pas de valeur, ou est réinitialisé.

3
if($FILES['image']['type'] == 'image/jpeg'){ 

La variable qui contient les données de téléchargement de fichier doit être $_FILES. Puisque $FILES est une variable vide (juste utilisée), votre variable $large est également vide donc vous déplacez un fichier vers le pictures/ qui est un répertoire, comme PHP vous l'a dit. Votre $error doit également contenir le message d'erreur, car aucun des ifs avant il est vrai.

Une façon d'éviter les erreurs comme celle-ci est de développer avec error_reporting mis à E_ALL qui aurait affiché un avis que votre variable $FILES (une faute de frappe) est indéfinie.

+0

Ne tenez pas compte de cette réponse, il semble que vous ayez fait une faute de frappe à cause du mauvais formatage de la question ici. Je suis d'accord avec la réponse de david.scheider, vérifiez le type mime retourné lors du téléchargement de IE. – Marko

Questions connexes