Proteger un fomulaire d'upload d'image?

Proteger un fomulaire d'upload d'image? - PHP - Programmation

Marsh Posté le 04-06-2008 à 09:31:23    

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
---------------------------------------------------------------------------------------------
                        <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;
}
?>
---------------------------------------------------------------------------------------------------------------

Reply

Marsh Posté le 04-06-2008 à 09:31:23   

Reply

Marsh Posté le 04-06-2008 à 09:56:55    

tu met une condition sur le $uploadedfile_name
 
if (strpos('.gif' , $uploadedfile_name) || strpos ('.jpg' , $uploadedfile_name) {
 // le deroulement de ta fonction
}
 
sinon tu peut toujours passer par un test sur le type mime


---------------
Recette cookeo Recette de cuisine
Reply

Marsh Posté le 04-06-2008 à 09:59:21    

le type mime sera mieux, autrement on prend un mp3, on la renomme en jpg et on contourne le système ...
 
dans ton traitement de formilaure, mets un print_r($_FILES) : tu verras qu'il t'apprendra plein de choses sur le fichier téléchargé, notamment son type mime.


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 04-06-2008 à 10:07:03    

merci pour vos reponses,
j'ai bien compris,je pense oui que verifie le type mine est le mieux, mais comment faire ensuite pour restreinte pour un jpg ou gif ?
désolé  je suis novice en php,
peut tu m'ecrire le code qu'il faudrait rajouter et à quel endroit , s'il te plait?

Reply

Marsh Posté le 04-06-2008 à 10:38:44    

pour verifier si tu as une image  
http://fr.php.net/manual/fr/functi [...] getype.php


---------------

Reply

Marsh Posté le 04-06-2008 à 11:04:21    

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

Reply

Marsh Posté le 04-06-2008 à 11:33:59    

ionik a écrit :

tu met une condition sur le $uploadedfile_name

Code :
  1. if (strpos('.gif' , $uploadedfile_name) || strpos ('.jpg' , $uploadedfile_name)) {
  2. // le deroulement de ta fonction
  3. }


 
sinon tu peut toujours passer par un test sur le type mime


 
Non, ce test n'est pas sur du tout, car un fichier dont le nom est

Code :
  1. fichier.jpg.php

passe ce test.
 

Citation :

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


 

Code :
  1. <?php
  2. if(exif_imagetype($uploadedfile) == 1 or exif_imagetype($uploadedfile) == 2) {
  3.     echo 'Image jpeg ou gif';
  4.     //suite de l'upload
  5. }
  6. else
  7. {
  8.     die('Fichier incorrect');
  9. }
  10. ?>


Message édité par Profil supprimé le 04-06-2008 à 14:23:27
Reply

Marsh Posté le 04-06-2008 à 12:25:34    

merci pour cette reponse,
j'ai essayé mais çà ne fonctionne pas, j'ai du mal inseré le code au bon endroit, pourrais tu me dire ou exactement faut il l'inseré?
merci bcp pour ton aide

Reply

Marsh Posté le 04-06-2008 à 12:53:20    

lucas => pourquoi != ?
exif_imagetype est censé renvoyer 1 ou 2, justement, pour ces 2 types ... à moins que je n'aie mal compris la doc. (je présume que tu voulais inverser l'action ?)


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 04-06-2008 à 14:22:57    

oups, oui j'ai inversé l'action mea culpa.
J'edite mon post.
Je me suis aussi permis de tout passer en simples quotes sauf la requete. ;)  
Code complet (pas testé, sans doute pas mal d'erreurs à corriger)

Code :
  1. <?php
  2. function upload_image($idevent , $uploadedfile , $uploadedfile_name)
  3. {
  4.     // upload an image for the event
  5.     global $CFG;
  6.     debug('image upload : '.$uploadedfile_name );
  7.     $uploadedfilename = '';
  8.     if(isset($uploadedfile) && $uploadedfile<>'none' && $uploadedfile_name != '' )
  9.     {
  10.         $path   = basename($uploadedfile_name); // does not use pathinfo function for compatibility     with PHP3
  11.         $pathex = explode('.' , $path);
  12.         $uploadedfilename = generate_filename('../'.$CFG->image_event_dir , $pathex[1]);
  13.         if($uploadedfilename['filename'] <> '' )
  14.           {
  15.             debug('uploadedfilename = '.$uploadedfilename["path"]);
  16.             if(exif_imagetype($uploadedfile) == 1 or exif_imagetype($uploadedfile) == 2) {
  17.                 if(!copy($uploadedfile,$uploadedfilename['path']))
  18.                 {
  19.                       echo('Sorry, Your file failed to upload.<br>' );
  20.                       echo('Either your file doesn\'t exist or it was too large.' );
  21.                       return '';
  22.                 }
  23.                 else
  24.                 {
  25.                       db_query("UPDATE $CFG->table_event SET image = '$uploadedfilename[filename]' WHERE id=$idevent" );
  26.                 }
  27.             }
  28.             else
  29.             {
  30.                 echo('Fichier incorrect : fichier JPEG ou GIF seulement');
  31.             }
  32.         }
  33.    }
  34.     else
  35.     {
  36.        echo('Sorry, Your file failed to upload.(filename generation failed)<br>' );
  37.     }
  38.   return $uploadedfilename;
  39. }
  40. ?>


Message édité par Profil supprimé le 04-06-2008 à 14:40:27
Reply

Marsh Posté le 04-06-2008 à 14:22:57   

Reply

Marsh Posté le 04-06-2008 à 14:25:11    

getimagesize marche pas trop mal non plus pour vérifier qu'il s'agit bien d'une image (mais pas sûr que ce soit fiable à 100%)


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-06-2008 à 19:32:36    

çà a l'air de fonctionner merci beaucoup , est ce que q'avec ce code y aurait encore des possibilité de contourner ce code?

Reply

Marsh Posté le 05-06-2008 à 20:25:57    

tu rajoutes le test getimagesize() si tu veux mais à priori pas de soucis.

Reply

Marsh Posté le 06-06-2008 à 09:32:41    

bonjour,
 
je suis encore la et dépité , car malgré la correction du code ci dessous, les hackers arrivent encore a me déposer
un fichier .php à partir du formulaire .
 
pourtant lorsque je fais un essai moi tout ce passe bien et seul les fichiers jpg ou gif son acceptés,?
 
si quelqu un pourrait m'aider à palier à ce probleme et me corriger le code ci dessous ( car tres novice en php )
 
merci bcp d'avance pour votre soutien
 
 
 

Reply

Marsh Posté le 06-06-2008 à 17:50:45    

Oui, mais est-ce que l'extension est .php ? si ce n'est pas le cas, il n'y a pas trop de risque (sauf si php est mal configuré)
utilise getimagesize().
Code :

Code :
  1. <?php
  2. function upload_image($idevent , $uploadedfile , $uploadedfile_name)
  3. {
  4.     // upload an image for the event
  5.     global $CFG;
  6.     debug('image upload : '.$uploadedfile_name );
  7.     $uploadedfilename = '';
  8.     if(isset($uploadedfile) && $uploadedfile<>'none' && $uploadedfile_name != '' )
  9.     {
  10.         $path   = basename($uploadedfile_name); // does not use pathinfo function for compatibility     with PHP3
  11.         $pathex = explode('.' , $path);
  12.         $uploadedfilename = generate_filename('../'.$CFG->image_event_dir , $pathex[1]);
  13.         if($uploadedfilename['filename'] <> '' )
  14.           {
  15.             debug('uploadedfilename = '.$uploadedfilename["path"]);
  16.             
  17.             $taille=getimagesize($uploadedfile);
  18.             define('LONGMIN',10);
  19.             define('HAUTMIN',10);
  20.             
  21.             if($taille[0]>LONGMIN && $taille[1]>HAUTMIN)
  22.             {
  23.                 if(exif_imagetype($uploadedfile) == 1 or exif_imagetype($uploadedfile) == 2) {
  24.                     if(!copy($uploadedfile,$uploadedfilename['path']))
  25.                     {
  26.                           echo('Sorry, Your file failed to upload.<br>' );
  27.                           echo('Either your file doesn\'t exist or it was too large.' );
  28.                           return '';
  29.                     }
  30.                     else
  31.                     {
  32.                           db_query("UPDATE $CFG->table_event SET image = '$uploadedfilename[filename]' WHERE id=$idevent" );
  33.                     }
  34.                 }
  35.                 else
  36.                 {
  37.                     echo('Fichier incorrect : fichier JPEG ou GIF seulement');
  38.                 }
  39.             }
  40.             else
  41.             {
  42.                 echo('Hauteur et Longueur insuffisante.');
  43.             }
  44.         }
  45.    }
  46.     else
  47.     {
  48.        echo('Sorry, Your file failed to upload.(filename generation failed)<br>' );
  49.     }
  50.   return $uploadedfilename;
  51. }
  52. ?>


Message édité par Profil supprimé le 08-06-2008 à 12:11:44
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed