Envoi d'images et sécurité

Mammouth du PHP | 555 Messages

22 févr. 2008, 19:58

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!
A+ et bon surf!!!!

Eléphant du PHP | 445 Messages

22 févr. 2008, 21:07

Il faut que tu controle l'extension du fichier, sa taille, sa largeur et hauteur.

ViPHP
AB
ViPHP | 5818 Messages

22 févr. 2008, 21:18

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.

Eléphant du PHP | 445 Messages

22 févr. 2008, 21:21

Et test aussi si le pseudo ne fini pas par .php

Car une image image.php.jpg est execute.

Mammouth du PHP | 555 Messages

22 févr. 2008, 22:06

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!
A+ et bon surf!!!!

Eléphant du PHP | 445 Messages

22 févr. 2008, 23:20

Je ne pense pas que ton preg_match fonctionne comme ceci.

Mammouth du PHP | 555 Messages

22 févr. 2008, 23:51

Re,
Effectivement le preg_match ne cpate rien de rien, pourquoi? comment?
Merci de ton aide!
A+ et bon surf!!!!

ViPHP
ViPHP | 5924 Messages

22 févr. 2008, 23:55

Car une image image.php.jpg est execute.
Non.

Eléphant du PHP | 445 Messages

23 févr. 2008, 00:02

Car une image image.php.jpg est execute.
Non.
J'ai tester sur differentes platformes et cela a fonctionner plusieurs fois.

Mammouth du PHP | 555 Messages

23 févr. 2008, 00:19

Un débat? Mettons que ca marche que faut il que je fasse pour m'en protéger?
Merci à tous!
A+ et bon surf!!!!

ViPHP
ViPHP | 5924 Messages

23 févr. 2008, 00:44

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…

Eléphant du PHP | 445 Messages

23 févr. 2008, 01:59

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é.

ViPHP
ViPHP | 5924 Messages

23 févr. 2008, 03:07

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…

Eléphant du PHP | 445 Messages

23 févr. 2008, 03:31

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é)

ViPHP
ViPHP | 5924 Messages

23 févr. 2008, 04:00

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…