Page 1 sur 2

Envoi d'images et sécurité

Posté : 22 févr. 2008, 19:58
par cicom
Salut à tous!
Je reviens vous embêter.
Alors voila j'ai fait un script d'envoi d'images en form + php pour les images membres, il fonctionne le seul truc c'est que je voudrais savoir s'il est sécurisé (et savoir comment fait on pour vérifier que le fichier est une image avant de le télécharger ou juste après l'avoir téléchargé)
voici les deux pages

Code : Tout sélectionner

<p class="text"> <?php if($pseudo == '') { echo 'Vous devez être logué pour faire ca. <a href="indeX.php">Retour</a><br />'; } else { ?> </p><form method="post" action="index.php?mod=loadpic1" enctype="multipart/form-data"><p class="text"> <input type="file" name="source1" /><input type="submit" value="envoyer" /></p></form><p class="text"><a href="index.php">Retour</a><br /> <?php } ?></p>
<p class="text">
<?php
if($pseudo == '')
{
 echo 'Vous devez être logué pour faire ca. <a href="index.php">Retour</a><br />';
}
else
{
 $uploaddir="imgmem/";
 if($_FILES['source1']['size'] > 1058576)
 {
  echo 'Fichier trop lourd! <a href="index.php?mod=loadpic">Retour</a><br />';
 }
 else
 {
  move_uploaded_file($_FILES['source1']['tmp_name'],$uploaddir.$pseudo.".jpg");
  mysql_query("UPDATE users SET photo = '".$site_var_adresse."/imgmem/".$pseudo.".jpg' WHERE pseudo = '".$pseudo."'");
  echo 'Image modifiée! <a href="index.php?mod=edprofil">Retour</a><br />';
 }
}
?></p>
Ne faites pas attention aux contrôles de connexion, les deux pages sont inclues par une autre tour à tour qui lui est sécurisé, ggère le design, la connexion bdd etc..
Merci de votre aide!

Posté : 22 févr. 2008, 21:07
par h0_noMan
Il faut que tu controle l'extension du fichier, sa taille, sa largeur et hauteur.

Posté : 22 févr. 2008, 21:18
par AB
Si tu veux que ton script soit sécurisé au mieux, il faut utiliser la fonction getimagesize() et voir si elle retourne les paramètres voulus pour contrôler que le fichier est bien une image.

Posté : 22 févr. 2008, 21:21
par h0_noMan
Et test aussi si le pseudo ne fini pas par .php

Car une image image.php.jpg est execute.

Posté : 22 févr. 2008, 22:06
par cicom
Salut,
Voici la dernière version du script, j'ai testé juste sur un point au cas ou le mec me mette un .php3 ou un .PHP etc..
Me manque plus que de tester la taille du fichier (j'avais essayé avec $_FILES['source1']['size'] mais ca n'avait pas l'air de marcher...)
<p class="text">
<?php
if($pseudo == '')
{
 echo 'Vous devez être logué pour faire ca. <a href="index.php">Retour</a><br />';
}
else
{
 $uploaddir="imgmem/";
 $size = getimagesize($_FILES['source1']['tmp_name']);
 if($size[0] > 0 AND $size[1] > 0)
 {
  if(preg_match('/'.$pseudo.'/i', '.'))
  {
   echo 'On essait pas de cracker!  <a href="index.php?mod=loadpic">Retour</a><br />';
  }
  else
  {
   move_uploaded_file($_FILES['source1']['tmp_name'],$uploaddir.$pseudo.".jpg");
   mysql_query("UPDATE users SET photo = '".$site_var_adresse."/imgmem/".$pseudo.".jpg' WHERE pseudo = '".$pseudo."'");
   echo 'Image modifiée! <a href="index.php?mod=edprofil">Retour</a><br />';
  }
 }
 else
 {
  echo 'Fichier incorrect! <a href="index.php?mod=loadpic">Retour</a><br />';
 }
}
?></p>
Merci à tous!

Posté : 22 févr. 2008, 23:20
par h0_noMan
Je ne pense pas que ton preg_match fonctionne comme ceci.

Posté : 22 févr. 2008, 23:51
par cicom
Re,
Effectivement le preg_match ne cpate rien de rien, pourquoi? comment?
Merci de ton aide!

Posté : 22 févr. 2008, 23:55
par Sékiltoyai
Car une image image.php.jpg est execute.
Non.

Posté : 23 févr. 2008, 00:02
par h0_noMan
Car une image image.php.jpg est execute.
Non.
J'ai tester sur differentes platformes et cela a fonctionner plusieurs fois.

Posté : 23 févr. 2008, 00:19
par cicom
Un débat? Mettons que ca marche que faut il que je fasse pour m'en protéger?
Merci à tous!

Posté : 23 févr. 2008, 00:44
par Sékiltoyai
J'ai tester sur differentes platformes et cela a fonctionner plusieurs fois.
Ce n'est pas un problème de plateforme, c'est un problème de configuration. Si la configuration dit qu'il faut exécuter les php, elle ne dit pas d'exécuter les .jpg

Donne le processus de test que tu as utilisé, car normalement tu ne peux pas avoir ce résultat…

Posté : 23 févr. 2008, 01:59
par h0_noMan
Je peux pas te dire quels etaient mes methodes de test, mais j'ai trouver des script d'upload d'images sur different serveur (Pages perso ou hebergement mutualisé) et la plupart du temps IMAGE.PHP.JPG contenant une image valide avec du code PHP dedans etait executé.

Posté : 23 févr. 2008, 03:07
par Sékiltoyai
Hé bien si tu veux faire le test, tu prends une image valide test.jpg et un script php test.php.jpg :
<?php
header('Location: ./test.jpg');
?>
Si tu n'as pas une image valide, c'est que le code ne s'exécute pas…

Posté : 23 févr. 2008, 03:31
par h0_noMan
Hé bien si tu veux faire le test, tu prends une image valide test.jpg et un script php test.php.jpg :
<?php
header('Location: ./test.jpg');
?>
Si tu n'as pas une image valide, c'est que le code ne s'exécute pas…
Je viens de tester sur FREE (oui je sais cela n'est pas un hebergeur mais je n'ait pas de serveur a disposition) et cela fonctionne.

IMAGE.PHP.JPG contient :
<?php
phpinfo() ;
?>
Après, il suffit d'avoir une image valide pour getimagesize() contenant du code PHP (ce qui n'est pas compliqué)

Posté : 23 févr. 2008, 04:00
par Sékiltoyai
Ouais, je viens de comprendre. Free a compilé PHP4 en tant que CGI, ce qui supprime une partie conséquente des sécurités au niveau du serveur, notamment, la compilation en CGI empèche l'utilisation des directives AddHandler limitant les fichiers exécutés par php. Donc il est vrai que si on utilise son script sur des serveurs mals administrés, on risque des problèmes de ce genre.

Comme mesure de sécurité, je conseillerais quelquechose de plus radical, c'est de mettre un .htaccess avec un Deny From All dans les dossiers des images et faire un script php appelé en lieu et place de l'image qui renverra le contenu du fichier. On évite ainsi tout accès direct et on a une mesure de sécurité très sure…