proteger un formulaire d'upload d'images?

Petit nouveau ! | 2 Messages

04 juin 2008, 10:00

bonjour,

voila mon probleme;

je suis novice en programation PHP,
j'ai recupéré un script d'agenda sur internet que j'ai bien installé, mais je subissais des attaques de hackers, et je me suis apercu qu'en fait il passait par ce script d'agenda par le formulaire d'upload d'image , ou l'on peut envoyer toute sorte de fichier.
Donc je voudrais tout simplement restreindre le format de fichier d'envoi à un "jpg ou gif"

Je vous joint ci dessous donc le script d'upload et le formulaire html,
si quelqu'un pouvait m'aider en me completant ce code pour palier à ce probleme
merci d'avance pour votre aide...


Formulaire d'envoi

Code : Tout sélectionner

<td width="75%" height="29" valign="top"> <br> <input type="image" border="0" name="imageField222" src="../images/carret0.gif" width="18" height="18" onClick="OnSubmit('upload')"> Upload image<br> <br> <input type="image" border="0" name="imageField2222" src="../images/logodel2.gif" width="15" height="15" onClick="OnSubmit('removeimage')"> Remove image </td>



scipt d'upload
<? 
 
function upload_image($idevent , $uploadedfile , $uploadedfile_name) 
{ 
 // upload an image for the event 
 global $CFG; 
 debug("image upload : $uploadedfile_name" ); 
  $uploadedfilename = ""; 
  if(isset($uploadedfile) && $uploadedfile<>"none" && $uploadedfile_name != "" ) 
  { 
   $path   = basename($uploadedfile_name); // does not use pathinfo function for compatibility with PHP3 
   $pathex = explode("." , $path); 
   $uploadedfilename = generate_filename("../".$CFG->image_event_dir , $pathex[1]); 
  
  
  
   if($uploadedfilename["filename"] <> "" ) 
   { 
 
    debug("uploadedfilename = ".$uploadedfilename["path"]); 
    if(!copy($uploadedfile,$uploadedfilename["path"]))//"$CFG->image_event_dir/".$uploadedfilename)) 
     { 
      echo("Sorry, Your file failed to upload.<br>" ); 
       echo("Either your file doesn't exist or it was too large." ); 
       return ""; 
     } 
     else 
    db_query("UPDATE $CFG->table_event SET image = '$uploadedfilename[filename]' WHERE id=$idevent" ); 
  } 
  else 
     echo("Sorry, Your file failed to upload.(filename generation failed)<br>" ); 
 } 
   return $uploadedfilename; 
} 
?> 

d0m
Mammouth du PHP | 1141 Messages

04 juin 2008, 10:12

salut,

dans un premier temps tu peux déjà vérifier si l'extension du fichier est '.jpg' ou '.gif' avec le nom du fichier.

Ensuite tu peux utiliser le type de fichier pour vérifier : $_FILES['imageField222']['type']

Petit nouveau ! | 2 Messages

04 juin 2008, 11:06

merci, mais comment et ou integrer tout çà sur mon code?

d0m
Mammouth du PHP | 1141 Messages

04 juin 2008, 16:43

il suffit, à l'aide des fonctions de chaines de caractères que tu trouveras dans le manuel, tu isoles ce qu'il y après le dernier point dans le nom du fichier. (Ce nom se trouvant dans $_FILES['...']['name'])

Ensuite tu fais un test sur l'extension et le type du fichier comme tes autres test, avant de vraiment copier le fichier.

Eléphant du PHP | 353 Messages

04 juin 2008, 20:17

salut,

dans un premier temps tu peux déjà vérifier si l'extension du fichier est '.jpg' ou '.gif' avec le nom du fichier.

Ensuite tu peux utiliser le type de fichier pour vérifier : $_FILES['imageField222']['type']
Ces deux méthodes sont aussi mauvaises l'une que l'autre et il est illusoire de croire qu'il suffit de contrôle l'extension d'un fichier pour s'assurer de son type.

Si mon fichier php porte l'extension jpg et s'il renvoie comme mime-type image/jpeg, est-ce une image ? Et si mon fichier en plus de faire cela faisait tout un tas de truc pas clair avant de renvoyer ce mime-type et une image pour faire plaisir à celui qui la veut :

fichier false_image.jpg

Code : Tout sélectionner

<?php /* instructions pas claires et peu recommandables */ header("Content-type: image/jpeg"); echo file_put_contents('ma_vraie_image.jpg'); ?>
Une solution légèrement meilleure est de demander à getimagesize() si le fichier passé en argument est une image. Ce n'est pas beaucoup mieux mais ça améliore tout de même le filtre.