8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,


Malgré des recherches avec l'ami Google et quelques lectures par çi par là, je n'arrive pas à mettre en place des limitations liées à l'envoi de fichier par formulaire.

Je m'explique: je suis en train de construire un site d'administration basique adaptable à divers projets, et sur certaines pages, je permets à l'utilisateur d'ajouter des fichier images.

L'upload vers le dossier que j'ai choisi se passe bien.
Mais j'aimerais maintenant mettre en place 2 limitations:

** limitation de la taille du fichier.
** limitation du type (ou de l'extension) du fichier.


En l'état actuel des choses, voici mon code:

* page avec le formulaire *


<?php

include("protect.php"); 
require_once("connexion.php");
include("fonctions.php");

// MES VARIABLES
$laTable = "personnes";
            
// LES FONCTIONS 
   function ajouter(){
       global $laTable;
       $nom = addslashes($_POST["nom"]);
       $prenom = addslashes($_POST["prenom"]);
       $fonction = addslashes($_POST["fonction"]);
       $fichier = $_FILES["fichier"]["name"];
       $texte = addslashes($_POST["texte"]);
       $mail = addslashes($_POST["mail"]);
       
       $sql = "INSERT INTO $laTable (nom,prenom,fonction,photo,texte,mail)
               VALUES ('$nom','$prenom','$fonction','$fichier','$texte','$mail');";
       mysql_query($sql);
   }
   
   function supprimer() {
        global $laTable,$tiroir; 
        $id = $_GET["del"];
        
        montrer($id);
        $lefichier = $tiroir->photo;
        
        if($lefichier !="" && file_exists("uploads/$lefichier")){
           unlink("uploads/$lefichier");  
        }
       
        $sql = "DELETE FROM $laTable
                WHERE id = $id;";
        mysql_query($sql);
   }
   
   function montrer($id){
       global $laTable,$tiroir;
       
       $sql = "SELECT *
               FROM $laTable
               WHERE id = $id ;";
       $resultat = mysql_query($sql);
       $tiroir = mysql_fetch_object($resultat);
   }
   
   function modifier(){
       global $laTable;
       $nom = addslashes($_POST["nom"]);
       $prenom = addslashes($_POST["prenom"]);
       $fonction = addslashes($_POST["fonction"]);
       $texte = addslashes($_POST["texte"]);
       $fichier = $_FILES["fichier"]["name"];
       $mail = addslashes($_POST["mail"]);
       $id = $_POST["id"];
       
       if ($_FILES["fichier"]["name"]!="") {
            $photo = $_FILES["fichier"]["name"];
            $sql = "UPDATE $laTable
                    SET nom = '$nom',
                        prenom ='$prenom',
                        fonction = '$fonction',
                        texte = '$texte',
                        mail ='$mail',
                        photo = '$photo'
                    WHERE id = $id;";
       }
       else {
           $sql = "UPDATE $laTable
                    SET nom = '$nom',
                        prenom ='$prenom',
                        fonction = '$fonction',
                        texte = '$texte',
                        mail ='$mail',
                        photo = '$photo'
                    WHERE id = $id;";
       }
      
       mysql_query($sql);
   }

// TESTS ET ROUTAGE ----------------------------------------------
// INSERT si il existe un POST id et qu'il est nul
         if (isset($_POST["id"]) && $_POST["id"]==0) {
             ajouter();
             upload();
         }         
// DELETE si il existe un GET del
         if (isset($_GET["del"])) {
            supprimer();
         }          
// SHOW  si il existe un GET show
         if (isset($_GET["show"])) {
            $id = $_GET["show"];
            montrer($id);
         }          
// UPDATE si il existe un POST id et qu'il est différent de 0
         if (isset($_POST["id"]) && $_POST["id"]>0) {
             modifier();
             upload();
          }
// ---------------------------------------------------------------

// Je formule ma requête et je stocke la recherche dans une armoire $resultat
                $sql = "SELECT *
	                FROM $laTable
	                ORDER BY nom ASC;";
                $resultat = mysql_query($sql);
?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Site d'administration - page des Rubriques</title>
        <link rel="stylesheet" href="styles.css">
        
        <script type="text/javascript" src="ckeditor/ckeditor.js"></script>
        
        <script>
            function confirmation(){
                message = "Etes vous sur de vouloir supprimer cette personne?"
                reponse = confirm(message);
                if (reponse==true){
                    return true;
                }
                else {
                    return false;
                }
            }
        </script>
    </head>
    
    <body>
        <div id="adminAccueil">
            <h1>Page d'administration - site COACHING</h1>
            
            <div id="corps">
                
                <div id="gauche">
                    <?php include("menu.php"); ?>
                
                    <?php include ("deconnexion.php");?>
                </div>
                
                <div id="spécifique">
                    <h2>Gestion des <?php echo $laTable; ?>:</h2>
                    
                    <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">
                        <fieldset><legend>Ajouter une personne</legend>
                            
                        <p><label for="nom">Nom : </label><input type="text" name="nom" value="<?php if (isset($_GET["show"])) {echo $tiroir->nom;} ?>" /></p>
                        <p><label for="prenom">Prénom : </label><input type="text" name="prenom" value="<?php if (isset($_GET["show"])) {echo $tiroir->prenom;} ?>" /></p>
                        <p><label for="fonction">Fonction : </label><input type="text" name="fonction" value="<?php if (isset($_GET["show"])) {echo $tiroir->fonction;} ?>" /></p>
                        <p><label for="photo">Photo : </label><input type="file" name="fichier" /></p>
                        
                        <input type="hidden" name="max_file_size" value="5242880">
                        
                        <p><label for="mail">Mail : </label><input type="text" name="mail" value="<?php if (isset($_GET["show"])) {echo $tiroir->mail;} ?>" /></p>
                        <p><label for="texte">Texte: </label><textarea class="ckeditor" id="editeur" name="texte" value="<?php if (isset($_GET["show"])) {echo $tiroir->texte;} ?>"></textarea>
                            <script type="text/javascript">
                                    CKEDITOR.replace( 'editor1' );
                            </script>
                        
                        <input type="hidden" name="id" value="<?php if (isset($_GET["show"])) {echo $tiroir->id;} else {echo "0";} ?>" />
                        
                        <p><input type="submit" /></p>
                        </fieldset>
                    </form>

                    <h2>Les personnes:</h2>
                    <ul class="liste"> 
                        <?php 
                            while($tiroir = mysql_fetch_object($resultat)){?>

                            <li><?php echo $tiroir->nom; ?> <?php echo $tiroir->prenom; ?>
                                <p>Fonction: <?php echo $tiroir->fonction; ?></p>
                                <p>Photo: <?php echo $tiroir->photo; ?></p>
                                <p>Texte: <?php echo $tiroir->texte; ?></p>
                                <p>Mail: <?php echo $tiroir->mail; ?></p>
                                <a href="<?php echo $_SERVER["PHP_SELF"]; ?>?show=<?php echo $tiroir->id; ?>">Modifier</a> - 
                                <a href="<?php echo $_SERVER["PHP_SELF"]; ?>?del=<?php echo $tiroir->id; ?>" onclick="return confirmation();">Supprimer</a>
                            </li>    
                    
                        <?php }?>
                    </ul>
                </div>
            </div> 
            
            <?php include("footer.php"); ?>
            
        </div>
    </body>
</html>


* page avec ma fonction d'upload (en include sur la page précédente) *


<?php

function upload(){
        $tempName = $_FILES["fichier"]["tmp_name"];
        $name = $_FILES["fichier"]["name"];
        $destination= "uploads/$name";

        move_uploaded_file($tempName, $destination);
}

?>




Voilà où mon travail en est, je vous avoue n'avoir jamais réalisé de limitations en ce qui concerne les fichiers, si quelqu'un pouvait m'expliquer, cela serait très aimable à vous.


En attendant de l'aide, je vous souhaite à tous et toutes une bonne journée!
Pour la taille du fichier, tu peux la récupérer via:
$taille = $_FILES["fichier"]["size"];

Pour l'extension du fichier, tu peux la récupérer à partir du nom du fichier:
$extension = strtolower(substr(strrchr($_FILES["fichier"]["name"], '.'), 1));

L'extension est ainsi récupérée en minuscule.
Evidemment cette solution ne scanne pas le fichier donc le fichier pourrait être un .exe renommé en .jpg et passer à travers tes tests!
Merci pour votre réponse.

Voici donc ce que j'ai mis en place en ce qui concerne la taille du fichier:


<?php

function upload(){
        $tempName = $_FILES["fichier"]["tmp_name"]; //nom du fichier temporaire
        $name = $_FILES["fichier"]["name"]; //nom original (sur le pc de l'utilisateur)
        
        $extension = strtolower(substr(strrchr($_FILES["fichier"]["name"], '.'), 1));
        $size = $_FILES["fichier"]["size"]; // taille du fichier

        
        $destination= "uploads/$name";
        
        // test de la taille:
        
        if($_FILES["size"]) > $_POST["max_file_size"]{
            $erreur = 'Le fichier que vous tentez d\'envoyer est trop gros.';
        }

        move_uploaded_file($tempName, $destination);
}

?>



La page me retourne une erreur de syntaxe:

Parse error: syntax error, unexpected '>' in C:\wamp\www\IEPSCF_PHP\adminCOACHING\fonctions.php on line 15

J'ai du mal à voir cette erreur.

En ce qui concerne l'extension du fichier, je ne sais pas comment construire mon if, je ne vois pas comment comparer, c'est la 1° fois pour moi que je tente ce genre d'exercice lol
if($_FILES["size"]) > $_POST["max_file_size"]{


Tu fermes ta parenthèse trop tôt

if($_FILES["size"] > $_POST["max_file_size"]) {

Modifié par MattBPA (13 Sep 2012 - 11:04)
En effet, je n'avais pas remarqué... Merci, l'erreur est donc bien corrigée Smiley cligne

Pour l'extension, j'essaye de trouver comment faire mais si vous avez des suggestions... je ne suis pas contre Smiley cligne
Modifié par caema (13 Sep 2012 - 11:23)
Si tu es sur que ce ne sont que des images, tu peux utiliser getimagesize();


$infos_img = getimagesize($monimage);
$largeur=$infos_img[0];
$hauteur=$infos_img[1];


Si le fichier n'a ni largeur ni hauteur, ce n'est pas une image

Ensuite, pour éviter tout risque (même si le risque 0 n'existe pas), je te conseille de donner un nom aléatoire à ton image (à base de time() par exemple) et de l'enregistrer dans une base de données. Ainsi, même si un utilisateur malveillant essaye de lancer son script uploadé, il aura plus de mal à trouver le fichier.

De plus, avec ton script, tu risques d'avoir des erreurs de nom (Si l'utilisateur uploade un fichier qui s'appelle "Mes vacances avec l'oncle de Zoë / Rémi", tu risques d'avoir du mal à l'afficher dans ton navigateur et interférer dessus sans passer par FTP.)
Si je tente d'envoyer un fichier qui n'est pas un fichier image, le code d'erreur que j'ai mais en place fonctionne bien, mais après l'envoi, j'ai le message d'erreur suivant:


( ! ) Notice: Undefined index: taille in C:\wamp\www\IEPSCF_PHP\adminCOACHING\fonctions.php on line 14
Call Stack
# Time Memory Function Location
1 0.0007 749328 {main}( ) ..\adminPersonnes.php:0
2 1.0541 769664 upload( ) ..\adminPersonnes.php:90
Variables in local scope (#2)

$destination = string 'uploads/cv.pdf' (length=14)

$extension = string 'pdf' (length=3)

$fichier = string 'cv.pdf' (length=6)

$taille = int 279552

$tempName = string 'C:\wamp\tmp\php8BE1.tmp' (length=23)




Il y a donc un soucis avec la variable "taille", mais je ne sais pas lequel.

Si je tente d'envoyer un fichier qui est bien une image (un jpg ici en l’occurrence), le message d'alert que j'ai mis en place et qui dit que ce n'est pas un fichier image s'affiche....
Modifié par caema (13 Sep 2012 - 11:50)
Undefined index: taille

ça veut dire que la variable $taille n'existe pas. En effet, tu l'as appelé $size.

Pour l'autre erreur, il faudrait voir le code.
Voilà donc ma correction:


<?php

function upload(){
        $tempName = $_FILES["fichier"]["tmp_name"]; //nom du fichier temporaire
        $fichier = $_FILES["fichier"]["name"]; //nom original (sur le pc de l'utilisateur)
        
        $extension = strtolower(substr(strrchr($_FILES["fichier"]["name"], '.'), 1));
        $size = $_FILES["fichier"]["size"]; // taille du fichier
        
        $destination= "uploads/$fichier";
        
        // test de la taille:
        
        if($_FILES["size"] > $_POST["max_file_size"]){
            echo "<script>alert(\"Le fichier que vous tentez d\'envoyer est trop gros.\")</script>"; 
        }
        
         // test de l'extension:
        
        if($extension != 'JPG' or $extension != 'gif' or $extension != 'jpeg' or $extension != 'png'){
            echo "<script>alert(\"Le fichier que vous tentez d\'envoyer n'est pas un fichier image.\")</script>"; 
        }
        
        else{
            move_uploaded_file($tempName, $destination);
        }
        
        
}

?>




Je sais, j'dois être assez énervante avec ce stupide problème lol, mais je suis dessus depuis hier et aprem, et je me connais... Tant que je n'aurais pas trouvé, ça va me prendre la tête Smiley langue


Voyez vous d'autres erreurs?
a écrit :
if($extension != 'JPG' or $extension != 'gif' or $extension != 'jpeg' or $extension != 'png'){


à remplacer par
if($extension != 'jpg' && $extension != 'gif' && $extension != 'jpeg' && $extension != 'png'){


Sinon:
1) Problème concernant la casse de l'extension jpg
2) Il y aura d'office minimum 3 de tes cas rencontrés!
Dans ta structure de conditions, si l'utilisateur envoie un jpg de 10M, il aura le javascript mais l'upload essaiera de se faire quand même.

Perso j'imbrique mes boucles de cette manière :

Si la taille est correcte
{
    Si l'extension est correcte
    {
         Upload
     }
    Sinon
    {
          Erreur
    }
}
Sinon
{
   erreur
}

Modifié par MattBPA (13 Sep 2012 - 13:08)
@MattBPA: Cela ne changera rien!
En effet la fonction move_uploaded_file() porte bien son nom; elle bougera le fichier déjà uploadé!

Le fichier est transmis avec le formulaire! Ainsi ton script de récupération ne sera traité qu'après rappariement des données et des fichiers sur le serveur.

Là il est possible d'agir, c'est en JS sur la formulaire de départ (donc avec d'avoir soumis le formulaire)