Page 1 sur 2

Sécurité pour upload d'images

Posté : 24 juil. 2006, 15:31
par drick
Bonjour à tous,

Petite question : pour controler que le client uplad bien et seulement une image, peut-on se fier à la variable $_FILE[photo][type] ? Peux-t-on outrapasser celà pour envoyer un fichier php par exemple ?
Merci de votre réponse.

Posté : 24 juil. 2006, 15:38
par DocType
tu teste le type de la photo, maios également les variables error de ton file/
<?      
if ($_FILES['nom_du_fichier']['error']) {
          switch ($_FILES['nom_du_fichier']['error']){
                   case 1: // UPLOAD_ERR_INI_SIZE
                   echo"Le fichier dépasse la limite autorisée par le serveur (fichier php.ini) !";
                   break;
                   case 2: // UPLOAD_ERR_FORM_SIZE
                   echo "Le fichier dépasse la limite autorisée dans le formulaire HTML !");
                   break;
                   case 3: // UPLOAD_ERR_PARTIAL
                   echo "L'envoi du fichier a été interrompu pendant le transfert !";
                   break;
                   case 4: // UPLOAD_ERR_NO_FILE
                   echo "Le fichier que vous avez envoyé a une taille nulle !");
                   break;
          }
}
else {
 // $_FILES['nom_du_fichier']['error'] vaut 0 soit UPLOAD_ERR_OK
 // ce qui signifie qu'il n'y a eu aucune erreur
}
?>

Posté : 24 juil. 2006, 15:39
par momox
Si tu veux vraiment être sur, vérifie le mime du fichier, c'est ce qu'il y a de plus sur :)
Ce qu'il faut savoir, c'est que si une personne uploade un fichier php avec une extension d'image, celui-ci ne pourra s'executer étant donné que seul les fichiers portant une extension associée au mime défini dans httpd.conf seront éxécuté en tant que fichier php :)
@+

Posté : 24 juil. 2006, 15:57
par drick
ok pour la gestion d'errreur, merci.

Ma question était plus tourné sur "comment $_FILE[photo][type] reconnait-il si c'est une image ou pas ?? " car s'il prend juste l'extension, c'est faillible..

Je me pencherai plus sur le check MIME, aurais-tu de la doc dessus ?

Merci

Posté : 24 juil. 2006, 16:34
par momox

Posté : 24 juil. 2006, 16:40
par starkeus
Oui alors je tiens à apporter ma contribution... je ne pense vraiment pas que l'on puisse faire confiance au type MIME des fichiers uploadés car il dépend apparemment du poste client. J'ai eu ce genre de problème pour des fichiers Excel et CSV...selon l'os (Win Xp ou 98...) j'avais des types différents... Alors ce que je dis n'est pas parole d'évangile. Peut être que des experts peuvent nous éclaircir et nuançer mes propos pessimistes :D

Posté : 24 juil. 2006, 16:54
par drick
oui mais pour des images ca ne doit pas poser de problemes ?
En plus il est possible de modifier le type MIME d'un fichier donc ce n'est encore pas la meilleure solution !
Si des experts passent dans le coin..

Posté : 25 juil. 2006, 14:18
par DocType
de toute facon, la meilleure facon c de mettre .jpg comme extension...
même si c'est un script php, il ne pourra pas l'éxecuter, sauf si c uploadé en .php :wink:

Posté : 25 juil. 2006, 16:33
par drick
Et si le fichier est un png, on lui rajoute un jpg ce qui le rend illisible ? :D
non mais avec un check file[photo][type] et un check MIME ca devrait aller..
apres on peux peut etre chmod la photo pour la rendre lisible mais pas executable comme ca si il y a upload de php il sera lisible mais pas executable ?

Posté : 25 juil. 2006, 21:16
par DocType
Et si le fichier est un png, on lui rajoute un jpg ce qui le rend illisible ? :D
non mais avec un check file[photo][type] et un check MIME ca devrait aller..
apres on peux peut etre chmod la photo pour la rendre lisible mais pas executable comme ca si il y a upload de php il sera lisible mais pas executable ?
le mieux serait de la convertir dans un format donné (gif png et jpg accepté, mais au final le fichier est un jpg)

Posté : 27 juil. 2006, 15:26
par drick
ok, ca peut etre une bonne solution..
J'ai regardé le manuel sur les images en PHP http://www.php.net/manual/fr/ref.image.php
mais a part png2wbmp() et jpeg2wbmp() je n'ai pas trouvé comment convertir jpg,bmp,png en jpg ?
Merci

Posté : 27 juil. 2006, 15:37
par drick
C'est bon j'ai trouvé comme un grand =)

on ouvre le fichier uploadé selon son extension :

Code : Tout sélectionner

imagecreatefromgif($file); //ouvre un fichier gif imagecreatefromjpeg($file); //ouvre un fichier jpeg imagecreatefrompng($file); //ouvre un fichier png imagecreatefromwbmp($file); //ouvre un fichier wbmp
et on l'enregistre dans un nouveau format (jpeg ici) :

Code : Tout sélectionner

$rep = 'images/'; imagejpeg($image, $rep);
C'est bien ça ??

Posté : 27 juil. 2006, 17:35
par naholyr
Sauf que ça dépend du fichier... Tout n'est pas avantageusement convertible en JPG. Essaie de convertir le logo PHPFrance (en ignorant la transparence hein, c'est encore un autre détail) en JPG, tu vas voir les lettres qui bavent, ou bien le poids qui augmente par rapport au GIF/PNG.

Typiquement : GIF, PNG, BMP -> PNG, et JPG -> JPG
Car ces formats n'ont pas le même objectif.

Ton objectif était de vérifier que le fichier uploadé est bien une image et pas un script déguisé ? Arrêter toi donc à imagecreatefrom*, si elle n'échoue pas tu as une image valide et tu n'as donc pas besoin d'aller plus loin dans ta vérification.

Posté : 01 août 2006, 10:44
par drick
Arrêter toi donc à imagecreatefrom*, si elle n'échoue pas tu as une image valide et tu n'as donc pas besoin d'aller plus loin dans ta vérification.
J'ai mis une image truqué php dans la fonction imagecreatefromgif() et il l'ouvre.. ce n'est donc pas le bon moyen :-/

Posté : 14 sept. 2006, 14:43
par Goulven
Merci les gars !

Je venais juste de poser mon if(){} et de commencer à chercher, un copier-coller et tout marche du premier coup.
Le tableau des codes d'erreur et la syntaxe au même endroit, c'est parfait.

Merci encore !