[RESOLU] Question sur la qualité de mon code

maryan
Invité n'ayant pas de compte PHPfrance

28 avr. 2021, 21:11

Bonjour à tous je débute en php en formation actuellement je vous avoir un avis de pro ou intermédiare sur mon code qui vérifie un upload image sachant que je débute le fichier renvoi True ou False et que je vérifie dans creationUser.php
Je voudrais votre avis savoir si je peux l'améliorer ou si j'oublie pas quelque chose merci !
PS : Me dire aussi ce que vous en pensez car déçu de mon prof qui m'a dit bof qu'on pouvait faire mieux du coup je voulais d'autres avis sur ce que l'on peux amélioré merci !
<?php
require_once  "CreationUser.php";

class UploadPhoto{

    public static function AjoutImage(){

          $img = $_FILES['photo']; // Tab info Image
          $name = $img['name']; // Nom de l'image
          $tmp = $img['tmp_name']; // Nom du dossier temporaire que php crée
          $maxSize = $img['size']; // Poids de l'image
          $maxTaille = [1000,1000]; // Tableau taille image en px max (pas obligatoire)
          $typeImg = $img['type']; // Type de l'image
          $codeER = $img['error']; // Code erreur généré par php
          $dossier = '../../img/client/'; // Dossier image
        // $img dc $_FILES['photo'] fait un var_dump ça te retourne un tab assoc qui a des valeurs et tu joues avec ces valeurs pour tester
          var_dump($img);
          $target = $dossier . basename($name);
          var_dump($tmp);

          $tabErrors = [
              0 => '<p class="text-danger text-center">Le téléchargement de l\'image c\'est passé avec succés !</p>',
              1 => '<p class="text-danger text-center">L\'image dépasse le poids autorisé !</p>', //taille defini dans le fichier php init
              2 => '<p class="text-danger text-center">La taille du fichier téléchargé excède 5Mo !</p>', //MAxsize dans html
              3 => '<p class="text-danger text-center">Le fichier n\'a été que partiellement téléchargé.</p>',
              4 => '<p class="text-danger text-center">Aucun fichier n\'a été téléchargé !</p>',
              6 => '<p class="text-danger text-center">Un dossier temporaire est manquant !</p>',
              7 => '<p class="text-danger text-center">Échec de l\'écriture du fichier sur le disque !</p>',
              8 => '<p class="text-danger text-center">Une extension PHP a arrêté l\'envoi de fichier !</p>',
              9 => '<p class="text-danger text-center">L\'image téléchargé ne respecte pas les conditions (extension/taille/poids)</p>',
          ];
   // Test extention de l'img
          $extension = strtolower(strrchr($name, ".")); // Mets tout en minuscule et recupére l'extention avec le point inclus
          $tabEX = [".png",".jpg",".jpeg",".gif",".bmp", ".svg", ".tiff", ".tga"]; // Tableau des extentions OK !
          $extER = [".php", ".js", ".java", ".html", ".css", ".py", ".php3", ".exe", ".bat", ".cmd", "vbs", "vbe", "jse", "wsf", "msc", ".7zip", ".rar", "zip",
          ".bzip", ".bzip2", ".xml", ".xhtml", ".sql", " "]; // Tab extention interdite au cas ou on pourrait les renommer...

        //Test si l'image est vide
        if(!empty($name))
        {
          $dimension = getimagesize($tmp); // recupére les dimensions de l'image dans un tableau $dimension[0]->width et $dimension[1]->height
          //Test sur l'image extension->poids->taille
          if(in_array($extension, $tabEX) && $maxSize < 5000000 && $maxTaille[0] >= $dimension[0] && $maxTaille[1] >= $dimension[1]){

            $name = md5($name);
            var_dump($name);

            switch($codeER)
              {
                  case 0:
                      $push = move_uploaded_file($tmp, "$dossier/$name");
                      return $push ;
                  case 1:
                      // Fichier init modifié  upload_max_filesize = 5000000 octets (5Mo)
                      echo $tabErrors[1];
                      break;
                  case 2:
                      // Taille de la balise MAX_SIZE dans HTML défini a 5Mo aussi ( optionnel avec l'erreur 1)
                      echo $tabErrors[2];
                      break;
                  case 3:
                      echo $tabErrors[3];
                      break;
                  case 4:
                      echo $tabErrors[4];
                      break;
                  case 6:
                      echo $tabErrors[6];
                      break;
                  case 7:
                      echo $tabErrors[7];
                      break;
                  case 8:
                      echo $tabErrors[8];
                      break;
              }
          }
          else
          {
              echo $tabErrors[9];
              return false;
          }
    }
    else{
      echo '<p class="text-danger text-center">le champ image est vide</p>';
    }
  } // fin function
} // fin Class

?>

Mammouth du PHP | 2703 Messages

28 avr. 2021, 21:36

dans un formulaire, j'ai 2 champs différents pour sélectionner 2 photos avec 2 noms différents. est-ce que je peux utiliser la fonction telle quelle ? non

pour des raisons historiques, les images sont stockées dans un repertorie "photos". est-ce que je peux utiliser la fonction telle quelle ? non

"L'image téléchargé ne respecte pas les conditions (extension/taille/poids)", ce serait mieux de dire quelle condition n'est pas respectée.

$name = md5($name);
$push = move_uploaded_file($tmp, "$dossier/$name");
perdre l'extension n'est pas une bonne idée.
cela génère un autre nom de fichier mais il n'est jamais renvoyé au code qui appelle la fonction.
il n'y a pas de gestion des éventuels doublons.

$extER est initialisé mais jamais utilisé.

je veux que la sortie soit du texte brut, or cela peut afficher "<p class="text-danger text-center">le champ image est vide</p>", soit de l'html.

maryan
Invité n'ayant pas de compte PHPfrance

28 avr. 2021, 23:40

1) Pk deux champs différents on m'en demande qu'un si j'avais besoin de deux champs j'aurais adapté mon code ...

2) "pour des raisons historiques, les images sont stockées dans un répertorie "photos". est-ce que je peux utiliser la fonction telle quelle ? non"
Je comprend pas pk ? Il n'ai pas stocké dans un dossier photos et heureusement ( à éviter 1 : trop facile à deviner 2 : les hackers vont se régaler 3 : le but d'aprés ce que j'ai compris on sécurise et on évite de rendre trop facile un code à être deviné non et peu importe image ou autre ? )
Si je dois préciser c'est un code d'exo par pour les gens ni le partage il a jamais été conçu pour être universel et je me doute qu'il ne fonctionnera pas si tu rajoutes des choses comme tous codes d'ailleurs (si tu rajoutes un input de name différent forcément faudra adapté ton code ... )

3) (ext poid taille) sont précisés dans le html donc la personne saura sont erreur le but est aussi d'éviter 50 if et un code trop long ...

4) Perdre l'extension excuse moi mais c'est une très bonne idée ??!!! En quoi ??
1 : Evite les doublons (je doute que plus d'un milliard de photos aillent dans mon dossier ou un dossier tout court sauf fb
2 : Evite les codes malicieux
3: Evite un code trop long
d'ailleurs conseiller sur php.net

5) Le fichier ou j'affiche mes images affiche bien mes images c'est juste ma partie PHP j'aurais cru que quelqu'un aurait compris lol
Donc oui mon image est récupérée et je l'affiche au besoin comme dit plus haut le fichier renvoie juste (true ou false) il affiche rien sauf des erreurs
6) $extER c'est écrit dans le commentaire au cas ou je voudrais par la suite interdire des extensions ça va de soit aussi qu'avec ce code on en à pas besoin mais c'est marqué dans les commentaires " au cas ou"
7)<p class="text-danger text-center"> Tu as peut être pas compris mais c'était juste pour l'afficher en rouge vite fait par defaut c'était blanc sur du blanc et oui je précise " je sais qu'on peut le faire en css ..."
Donc en gros j'ai pas compris du coup ce que je dois amélioré et je parle pas de chichi dsl mais là, tes critiques ... en tout cas rien que je ne savais pas !
Je parle de la structure, du fonctionnelle si on peut le raccourcir, le sécurisé en plus, amélioré les erreurs du code ['error'], faire d'autre vérif demander si mon code est sécurisé pas des critiques pour critiquer ...