Membres


Pas encore membre ?
inscrivez-vous ici

Connexion :
Login
Code
Mot de passe perdu ?
Liste des membres

script Upload d une photo sécurisé

Script Upload d une photo sécurisé


Script Upload d une photo sécurisé     Posté le 16/02/2005 à 00:00
Foluia
Membre
foluia
Site perso
342 posts
Inscrit le : 18/12/2004
Voilà, je met ici mon script pour uploader des .jpg
Il peut servir je pense, et je le met à la disposition de tous.
Il permet de remplacer une image .jpg se situant dans les adresses définies (/images/affiches/panneau1/).
pour cela il charge temporairement l'image dans un dossier (telechargement) garde l'originale dans sa taille d'origine et crée une miniature. Quand cela est fait il déplace puis vide le fichier telecharger.
Il n'autorise que les fichier .jpg (ton upload n'est pas sécurisé sky, ca peut présenter un danger).
Vous pouvez voir le fonctionnement sur http://pharmadijon.free.fr/index.php?page=affichagelibre
voilà.

<?php
if ($_POST)
{

if (
$_POST["envoyer"])
   {
  if (
is_uploaded_file($_FILES["fichier"]["tmp_name"]))
{
echo 
'<font style="color: #0D0836"><p align="center">';
echo 
'Etape 1 :Le fichier '.$_FILES["fichier"]["name"].' a bien été téléchargé.<br /><br /><br />';
       
$extension  'jpg';
           if(
substr($_FILES["fichier"]["name"], -3) == $extension)
           {
 if (
move_uploaded_file($_FILES["fichier"]["tmp_name"],"./images/affiches/panneau1/telechargement/".$_FILES["fichier"]["name"]))
 {
 
$nom=$_FILES["fichier"]["name"];
                   
$nom2="images/affiches/panneau1/telechargement/".$nom
                   
$handle=imagecreatefromjpeg($nom2);
                                                 &nbs p;                  
       
$x=imagesx($handle);
       
$y=imagesy($handle);
       
$k=$x/180;
    
       
$y_dest=$y/$k;
                   
$destination imagecreatetruecolor(180,$y_dest); 
             
imagecopyresampled($destination$handle0000180$y_dest$x$y);
                    
imagejpeg($destination'images/affiches/panneau1/affichelibrepetite.jpg',100);
                    
rename($nom2"images/affiches/panneau1/affichelibregrande.jpg");
                    
imagedestroy($handle);
       
imagedestroy($destination);
       echo 
'Etape 2 : L\'image a bien été traitée, elle est redimensionnée<br /><br /><br />';
 echo 
'Etape 3 : Ok, l\'affiche est bien remplacée !<br /><br />';
 echo 
'Toutes les étapes ont été traitées avec succès<br /><br />';
 echo 
'Il se peut que le résultat ne soit pas visible de suite du faite de la mémoire de votre ordinateur, 
 ne vous inquitez pas<br /><br />'
;
 echo 
'retour vers la page d\'affichage :<a href="http://pharmadijon.free.fr/index.php?page=affichagelibre">ici</a><br /><br />';
 echo 
'</p></font>';
 }
}
     else
{
unlink($_FILES["fichier"]["name"]);
echo 
'<p align="center"><font style="color: #0D0836">Le fichier que vous avez tenté d\'envoyer n\'est pas un .jpg, il a été effacé.</p></font>';
                                                 
                                                 }
}
else
    {
   echo 
'Le fichier '.$_FILES["fichier"]["name"].' n\'a pas été téléchargé<br />'.
   
'Peut-être dépassait-il la limite des 1Mo<br />'.
   
'A moins que tu n\'ais essayé de truander';
   }
 }
   }
     else
   {
   echo 
'<p align="center"><font style="color: #0D0836"><p style="text-indent: 45px; line-height: 150%; margin: 0 6px"> <p style="text-indent: 45px; line-height: 150%; margin: 0 6px">
                                <u><font style="color: #0D0836">Fonctionnement : </font>
                                </u>
                                <p style="text-indent: 45px; line-height: 150%; margin: 0 6px">&n bsp;<p style="text-indent: 45px; line-height: 150%; margin: 0 6px">
                                <font style="color: #0D0836">le script formé par cette 
                                page vous permet de mettre en ligne la nouvelle 
                                affiche. Choisissez l\'emplacement de la nouvelle 
                                affiche dans l\'ordinateur à l\'aide du bouton parcourir, puis&nbs p;cliquez sur 
                                "envoyer". <br /></font>
                                <font style="color: #FF0000">L\'image doit etre un .jpg (pour des raisons de taille et de sécurité).
                                (exemple satonestfoudetoi.jpg)</font><br /><font style="color: #0D0836">
                                Après avoir cliqué sur 
                                "envoyer" et être retourné sur la page 
                                d\'accueille il se peut que vous ne voyez pas la 
                                nouvelle affiche. Ne vous inquiétez pas et ne 
                                recommencez pas la manipulation, si vous ne 
                                voyez pas la nouvelle affiche c\'est tout simplement car ordi nateur 
                                garde en mémoire le site (de manière a accélérer 
                                la navigation).<p style="text-indent: 45px; line-height: 150%; margin:&nb sp;0 6px">
                                 <p style="text-indent: 45px; line-height: 150%; margin: 0 6px" >
                                <br /><p align="center">L\'image ne doit pas faire plus&nbs p;de 1Mo</p></font><br />
                                    
                                    <font style="color: #0D0836"><center>
                                    <form enctype="multipart/form-data" method="post">
                                    <input type="hidden" name="MAX_FILE_SIZE" value="1000000000">
                                    <font style="color: #000035">Télécharger l\'image.</font><p>
                                    <font style="color: #000035"> <input name="fichier" type="file"></font></p>
                                    <p>
                                    <font style="color: #000035"> <input name="envoyer" type="submit" value="Envoyer">
                                    </font>
                                    </p>
                                    </form>
                                    </center>
                                    </p>'
;
                                    
}
?>

Je viens d'éditer, il y avait un petit soucis.

________________________
Je vous dois un grand merci pour tout ce que j ai apris et pour le temps que vous passez pour moi.
 
Réponse à : Script Upload d une photo sécurisé     Posté le 17/02/2005 à 22:17
Ajira
Membre
Avatar
14 posts
Inscrit le : 14/02/2005
Effectivement il y a un léger soucis, mais cela vient du forum, il n'affiche pas les slash (orienté haut/gauche, bas/droite), et logiquement cela créer des problèmes avec la fonction echo ...

Pourrait tu commenter la fonction :
imagecopyresampled()

et ce code :

                                      if ($_POST)
                                         {
                                              
                                           if ($_POST["envoyer"])
                                             {
                                            if (is_uploaded_file($_FILES["fichier"]["tmp_name"]))
}
}


Ca m'aiderai a comprendre :p Et merci beacoup de proposer ce petit script très utile smiley

_______________________
Aucun
 
Réponse à : Script Upload d une photo sécurisé     Posté le 17/02/2005 à 23:02
foluia
Membre
Avatar
Site perso
342 posts
Inscrit le : 18/12/2004
http://www.nexen.net/docs/php/annotee/function.imagecopyresampled.php

en fait, les deux premiers if, servent à vérifier si la variable $_post à bien été crée, donc que l'on a envoyé quelque chose, ca pourrait etre remplacé par
if(isset($_POST["envoyer"]){}
et le dernier, à verifier que le fichier à bien été uploadé.

Pour ceux qui voudraient utiliser mon script, pensez que le forum ne montre pas les \' et donc qu'il peut y avoir des erreures, il faut penser à les remettres dans votre script.

_______________________
Je vous dois un grand merci pour tout ce que j ai apris et pour le temps que vous passez pour moi.
 
Réponse à : Script Upload d une photo sécurisé     Posté le 18/02/2005 à 22:24
Ajira
Membre
Avatar
14 posts
Inscrit le : 14/02/2005
Bonsoir,
Alors voilà après compréhension (enfin je pense smiley) du script. Je me suis dis que j'aller tester tel quel, bien sur en adaptant aux dossiers de mon site. la 1ère etape passe bien, puis ensuite s'affiche :


Etape 1 :Le fichier 05.jpg a bien été téléchargé.

Warning: move_uploaded_file(./images/fanart/telechargement/05.jpg): failed to open stream: No such file or directory in /home/blabla/www/blabla/test.php on line 15

Warning: move_uploaded_file(): Unable to move '/tmp/php6WhQL6' to './images/fanart/telechargement/11 copie.jpg' in /home/blabla/www/blabla/test.php on line 15


Pourrais t-on m'expliquer le problème ?
Et j'avoue avoir du mal à concevoir un script d'upload sans demande des identifiants FTP, enfin ca semble etre une porte ouverte aux hackers ...
Merci de bien vouloir m'éclairer smiley

_______________________
Aucun
 
Réponse à : Script Upload d une photo sécurisé     Posté le 18/02/2005 à 23:24
foluia
Membre
Avatar
Site perso
342 posts
Inscrit le : 18/12/2004
Bon, il est relativement dur d'expliquer les erreures étant donné que bien que ce soit mon script, je ne sais pas trop comment tu l'as adapté dans le tien, avec les lignes. Pourrais tu mettre ta page entière en ligne ?
Il faut que tu sois certains que les dossiers sur ton site existe.
Le problème peut aussi provenir du fait que tu n'ais pas donné les droits d'écriture et de modifications aux dossiers de ton script.
Ou es tu hebergé ?
Pour comprendre comment écrire dans un dossier, regarde ici : http://siteduzero.com/php/fichier.php#chmod
Il semble y avoir un espace ici : 11 copie.jpg évite ;) corrige cela dans le script.
Oui, faire un script d'upload peut etre une porte ouverte aux hackers. Cependant dans mon script, seuls les fichiers présentant une extention ".jpg" sont autorisés, ce qui limite. Secondo, ce sont des images, elles ne sont pas éxécutées, mais simplement lus, ce qui limite encore.
Après, tu peux facilement concevoir un script avec mots de pass.
Voilà.

_______________________
Je vous dois un grand merci pour tout ce que j ai apris et pour le temps que vous passez pour moi.
 
Réponse à : Script Upload d une photo sécurisé     Posté le 19/02/2005 à 02:37
3run0
Visiteur
Avatar
arrétez le délire :
-on ne verifie pas les 3 lettres d'extension mais le type de fichier (renomme un fichier php en jpg met le dans un include et tu verra le resultat!)
-il sert strictement à rien de renomer le fichier source sauf si vous avez une bonne raison de le faire.
voici un script qui marche trés bien mais qui peut etre amélioré (filtrage des espaces et des accents par exemple, remplacement des extensions majuscule en minuscule, prise en charge des type bmp etc ...).
avant de l'utiliser pensez à créer le dossier images avec les droits d'écriture.
il pourait être plus court mais il à le merite d'être lisible et comprehensible.

 <form enctype="multipart/form-data" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="700000">
  <input name="fichier" type="file">
  <input name="envoyer" type="submit" value="envoyer">
 </form>
  <?
//on verifie l\'envoie
  
if($_POST["envoyer"]){
//si le fichier temporaire est telecharger en memoire
  
if (is_uploaded_file($_FILES["fichier"]["tmp_name"])){
//on crée la variable extension
   
$extens$_FILES["fichier"]["type"];
//on crée la variable fichier
   
$fichier=$_FILES["fichier"]["name"];
//on controle le type de fichier et non les 3 dernieres lettres qui peuvent etre fausse
   
if($extens==('image/jpg' || 'image/jpeg' || 'image/pjpeg' || 'image/gif' || 'image/png'||'image/x-png')){
//si le fichier temporaire est renommé et deplacé vers le disque attention au chmod
   
if (move_uploaded_file($_FILES["fichier"]["tmp_name"],"images/".$fichier)){
//on crée l'image support en fonction de son type
switch($extens){
case(
"image/jpg"):
case(
"image/jpeg"):
case(
"image/pjpeg"):$handle imagecreatefromjpeg("images/".$fichier);
break;
case(
"image/gif"):$handle imagecreatefromgif("images/".$fichier);
break;
case(
"image/x-png"):
case(
"image/png"):$handle imagecreatefrompng("images/".$fichier);
break;
}
//un peu de maths pour dimensionner le support
 
$x=imagesx($handle);
 
$y=imagesy($handle);
 
$k=$x/100;
 
$y_dest=$y/$k;
 
$dst_img imagecreatetruecolor(100,$y_dest);
//on copy la vignette sur le support
 
imagecopyresampled($dst_img$handle0000100$y_dest$x$y);
//on ecrit cette vignette sur le disque en fonction de son type
switch($extens){
case(
"image/jpg"):
case(
"image/jpeg"):
case(
"image/pjpeg"): imagejpeg($dst_img"images/th_$fichier"100);
break;
//les fichier gif seront en realité des png alors attention ici plus de couleur transparante et d\'animation&nb sp;imagegif() etant trop souvent desactivé sur les serveurs
case("image/gif"):
case(
"image/x-png"):
case(
"image/png"): imagepng($dst_img"images/th_$fichier"100);
break;
}
//on detruit les images créées en memoire
 
imagedestroy($handle);
 
imagedestroy($dst_img);
//on affiche le resultat
print "<a href=\"images/".$fichier."\"><img src=\"images/th_".$fichier."\" />cliquez pour agrandir</a>";
}
}else{
//si le fichier n\'est pas du bon type on affiche se message et rien ne se passe
print "extension ".$extens."refus&eacute;e";
}
}
}

?>



_______________________
 
Réponse à : Script Upload d une photo sécurisé     Posté le 19/02/2005 à 15:59
foluia
Membre
Avatar
Site perso
342 posts
Inscrit le : 18/12/2004
que veux dire cette ligne
   if($extens==('image/jpg' || 'image/jpeg' || 'image/pjpeg' || 'image/gif' || 'image/png'||'image/x-png'))

?
image correspond à l'emplacement du dossier ?
et dans le cas de ces lignes : "case("image/jpeg"smiley"
image correspond à un dossier ou non ?

_______________________
Je vous dois un grand merci pour tout ce que j ai apris et pour le temps que vous passez pour moi.
 
Réponse à : Script Upload d une photo sécurisé     Posté le 19/02/2005 à 16:16
3run0
Administrateur
Avatar
1764 posts
Inscrit le : 1/10/2004
c'est tout simplement l'entete d'un fichier image, restituée par $_FILE['fichier']['type'];
ça correspond pas à un repertoire mais au type de l'image qui peut être differend même si il porte la même extention.
ex: image/png et image/x-png sont de type differents mais porte la même extension: logo.png

_______________________
_ww.gabian-herault.com
 
Réponse à : Script Upload d une photo sécurisé     Posté le 19/02/2005 à 16:29
foluia
Membre
Avatar
Site perso
342 posts
Inscrit le : 18/12/2004
Voilà mon script dérivé de ce que tu as mis plus haut.
 <?   
                                      
if ($_POST)
                                          {
                                                
                                            if (
$_POST["envoyer"])
                                              {
                                             if (
is_uploaded_file($_FILES["fichier"]["tmp_name"]))
                                                 {
                                                 echo 
'<font style="color: #0D0836"><p align="center">';
                                                 echo 
'Etape 1 :Le fichier '.$_FILES["fichier"]["name"].' a bien été téléchargé.<br /><br /><br />';
                                                 
$extens$_FILES["fichier"]["type"];
                                                    
$fichier=$_FILES["fichier"]["name"];
                                                    if(
$extens==('image/jpg' || 'image/jpeg' || 'image/pjpeg' || 'image/gif' || 'image/png'||'image/x-png'))
                                                        {
                                                         
                                                  if (
move_uploaded_file($_FILES["fichier"]["tmp_name"],"./images/affiches/panneau1/telechargement/".$fichier))
                                                      {
                                                     
                                                       
                                                      
//on crée l'image support en fonction de son type
                                                      
switch($extens)
                                                      {
                                                      case(
"image/jpg"):
                                                      case(
"image/jpeg"):
                                                      case(
"image/pjpeg"):$handle imagecreatefromjpeg("./images/affiches/panneau1/telechargement/".$fichier);
                                                      break;
                                                      case(
"image/gif"):$handle imagecreatefromgif("./images/affiches/panneau1/telechargement/".$fichier);
                                                      break;
                                                      case(
"image/x-png"):
                                                      case(
"image/png"):$handle imagecreatefrompng("./images/affiches/panneau1/telechargement/".$fichier);
                                                      break;
                                                      }
                                                      
$nom2="images/affiches/panneau1/telechargement/".$fichier
                                                                   &n bsp; 
                                                      
$x=imagesx($handle);
                                                      
$y=imagesy($handle);
                                                      
$k=$x/180;
                                                      
$y_dest=$y/$k;
                                                      
                                                      
$destination imagecreatetruecolor(180,$y_dest); 
                                                      
imagecopyresampled($destination$handle0000180$y_dest$x$y);
                                                      switch(
$extens)
                                                      {
                                                      case(
"image/jpg"):
                                                      case(
"image/jpeg"):
                                                      case(
"image/pjpeg"): imagejpeg($destination'images/affiches/panneau1/affichelibrepetite.jpg',100);
                                                      break;
                                                      case(
"image/gif"):
                                                      case(
"image/x-png"):
                                                      case(
"image/png"): imagepng($destination'images/affiches/panneau1/affichelibrepetite.jpg',100);
                                                      break;
                                                      }
                                                      
rename($nom2"images/affiches/panneau1/affichelibregrande.jpg");
                                                      
imagedestroy($handle);
                                                      
imagedestroy($destination);
                                                      
                                                      
                                                      echo 
'Etape 2 : L\'image a bien été traitée, elle est redimensionnée<br /><br /><br />';
                                                      echo 
'Etape 3 : Ok, l\'affiche est bien remplacée !<br /><br />';
                                                      echo 
'Etape 4 : Enregistrement du message<br /><br />';
                                                                   &n bsp;                                &nbs p;              if(
$_POST['commentaire'] != NULL)
                                                          {
                                                          echo 
'Enregistrement du message en cours<br /><br />';
                                                          
$commentaire htmlentities ($_POST['commentaire']);
                                                          
$commentaire2 addslashes ($commentaire);
                                                          
$monfichier fopen('images/affiches/panneau1/commentaire1.txt''r+');
                                                          
$message fgets($monfichier);
                                                          
$message $commentaire2;
                                                          
fseek($monfichier0);
                                                          
fputs($monfichier$message);
                                                          
fclose($monfichier);
                                                          echo 
'Votre message :<i>' $message '</i><br /><br />';
                                                          echo 
'Le message a bien été enregistré<br /><br />';
                                                          }
                                                      else
                                                          {
                                                          
$monfichier fopen('images/affiches/panneau1/commentaire1.txt''r+');
                                                          
$message fgets($monfichier);
                                                          
$message '<i>Abscence de message</i>';
                                                          
fseek($monfichier0);
                                                          
fputs($monfichier$message);
                                                          
fclose($monfichier);
                                                          echo 
'N\'ayant pas écrit de message, aucun n\'a été enregistré, l\'image n\'en aura pas.<br /><br />';
                                                          }
                                                          
                                                      echo 
'Fin d\'enregistrement du message associé<br /><br />';
                                                      echo 
'Toutes les étapes ont été traitées avec succès<br /><br />';
                                                      echo 
'Il se peut que le résultat ne soit pas visible de suite du faite de la mémoire de votre ordinat eur, 
                                                      ne vous inquitez pas<br /><br />'
;
                                                      echo 'retour vers la page d\'affichage :<a href="http://pharmadijon.free.fr/index.php?page=affichagelibre">ici</a><br /><br />';
                                                      echo 
'</p></font>';
                                                      }
                                                 }
                                                 }
                                                 else
                                                     {
                                                    echo 
'Le fichier '.$_FILES["fichier"]["name"].' n\'a pas été téléchargé<br />'.
                                                    
'Peut-être dépassait-il la limite des 1Mo<br />'.
                                                    
'A moins que tu n\'ais essayé de truander';
                                                    }
                                            }
                                        }
                                    else
                                        {
                                        echo 
'<p align="center"><font style="color: #0D0836"><p style="text-indent: 45px; line-height: 150%; margin: 0 6px">&nbsp;<p style="text-indent: 45px; line-height: 150%;&nbs p;margin: 0 6px">
                                <u& gt;<font style="color: #0D0836">Fonctionnement : </font>
                                </u >
                                <p& nbsp;style="text-indent: 45px; line-height: 150%; margin: 0 6px">&nbsp;<p style="text-indent: 45px; line-height: 150%; margin: 0&n bsp;6px">
                                <fo nt style="color: #0D0836">le script formé par cette 
                                page&n bsp;vous permet de mettre en ligne la nouvelle 
                                affich e. Choisissez l\'emplacement de la nouvelle 
                                affich e dans l\'ordinateur à l\'aide du bouton parcourir, puis cliquez sur 
                                &q uot;envoyer&quot;. <br /></font>
                                <fo nt style="color: #FF0000">L\'image doit etre un .jpg (pour des raisons de taille et de sécurité).
                                (exemp le satonestfoudetoi.jpg)</font><br /><font style="color: #0D0836">
                                Après& nbsp;avoir cliqué sur 
                                &q uot;envoyer&quot; et être retourné sur la page 
                                d\'acc ueille il se peut que vous ne voyez pas la 
                                nouvel le affiche. Ne vous inquiétez pas et ne 
                                recomm encez pas la manipulation, si vous ne 
                                voyez& nbsp;pas la nouvelle affiche c\'est tout simplement car ordinateur 
                                garde& nbsp;en mémoire le site (de manière a accélérer 
                                la&nbs p;navigation).<p style="text-indent: 45px; line-height: 150%; margin: 0 6px">
                                &n bsp;<p style="text-indent: 45px; line-height: 150%; margin: 0 6px">
                                <br  /><p align="center">L\'image ne doit pas faire plus de 1Mo</p></font><br />
                                     
                                     <font style="color: #0D0836"><center>
                                     <form enctype="multipart/form-data" method="post">
                                     <p style="margin:0 6px; text-align: center; text-indent:45px; line-height:150%">
                                     Texte a associer à l\'image :
                                     </p>
                                     <p style="text-align: center">
                                     <input type="text" name="commentaire" size="25" maxlength="60" >
                                     </p>
                                     Télécharger l\'image.<p>
                                     &nbsp;<input name="fichier" type="file"></p>
                                     <p>
                                     &nbsp;<input name="envoyer" type="submit" value="Envoyer">
                                     </font>
                                     </p>
                                     </form>
                                     </center>
                                     </p>'
;
                                     
                                     }
                                     
?>

tu peux le tester ici : http://pharmadijon.free.fr/index.php?page=affichagelibre1
avec une image normale, il marche, seulement, avec un autre fichier, il plente. peux tu m'expliquer ?

_______________________
Je vous dois un grand merci pour tout ce que j ai apris et pour le temps que vous passez pour moi.
 
Réponse à : Script Upload d une photo sécurisé     Posté le 19/02/2005 à 17:36
3run0
Visiteur
Avatar

bon j'ai apporté une correction (un switch a la place du if qui triait le type de fichier)

 <form enctype="multipart/form-data" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="700000">
  <input name="fichier" type="file">
  <input name="envoyer" type="submit" value="envoyer">
 </form>
  <?
//on verifie l\'envoie
  
if($_POST["envoyer"]){
//si le fichier temporaire est telecharger en memoire
  
if (is_uploaded_file($_FILES["fichier"]["tmp_name"])){
//on crée la variable extension
   
$extens$_FILES["fichier"]["type"];
//on crée la variable fichier
   
$fichier=$_FILES["fichier"]["name"];
//on controle le type de fichier et non les 3 dernieres lettres qui peuvent etre fausse
switch($extens){
case(
"image/jpg"):
case(
"image/jpeg"):
case(
"image/pjpeg"):
case(
"image/gif"):
case(
"image/x-png"):
case(
"image/png"):
//si le fichier est renommé et deplacé vers le disque
   
if (move_uploaded_file($_FILES["fichier"]["tmp_name"],"images/".$fichier)){
//on crée l'image support en fonction de son type
switch($extens){
case(
"image/jpg"):
case(
"image/jpeg"):
case(
"image/pjpeg"):$handle imagecreatefromjpeg("images/".$fichier);
break;
case(
"image/gif"):$handle imagecreatefromgif("images/".$fichier);
break;
case(
"image/x-png"):
case(
"image/png"):$handle imagecreatefrompng("images/".$fichier);
break;
}

//un peu de maths pour dimensionner le support
 
$x=imagesx($handle);
 
$y=imagesy($handle);
 
$k=$x/100;
 
$y_dest=$y/$k;
 
$dst_img imagecreatetruecolor(100,$y_dest);
//on copy la vignette sur le support
 
imagecopyresampled($dst_img$handle000