Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PHP] Sécurité upload => path_info()

    7 mai 2019 à 15:38:51

    Bonjour 

    Je souhaiterais avoir de la lumière sur le cours "protégez-vous efficacement contre les failles du web"

    et dans ce cours est évoqué la double extension

    sans reprendre le cours 

    "backdoor.php.jpg" ou "backdoor.php\0.jpg". Le "\0" indique au serveur qu'il arrive en bout de chaine. Tout ce qui suit ne sera donc pas interprété.

    et utilise path_info() avec l'option PATH_EXTENSION pour récupérer l'extension 

    <?php
    
    $file = $_FILES["MY_FILE"];
    $actualName = $file['tmp_name'];
    $newName = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
    $path = "/upload"
    
    // On crée un tableau avec les extensions autorisées
    $legalExtensions = array("JPG", "PNG", "GIF", "TXT");
    
    // On récupère l'extension du fichier soumis et on vérifie qu'elle soit dans notre tableau
    $extension = pathinfo($file['MY_FILE'], PATHINFO_EXTENSION);
    
    if (in_array($extension, $legalExtensions)) {
        move_uploaded_file($actualName, $path.'/'.$newName.'.'.$extension);
    }
    
    ?>

    mais selon php.net l'option PATH_EXTENSION récupère la dernière extension

    "Si path contient plus d'une extension, PATHINFO_EXTENSION retourne uniquement le dernier"

    En l’occurrence dans le cas d'une double extension nous ne sommes pas protégé non plus avec cette méthode ? 

    il vaut mieux récupérer la première occurence après le premier point avec strstr?

    • Partager sur Facebook
    • Partager sur Twitter
      7 mai 2019 à 16:08:46

      Salut,

      foo.min.js est un nom de fichier valide, si tu protège le premier point donc tu supposes que .js n'est pas une extension valide ? pathinfo ne sait rien du contenu, la preuve tu peux donner en argument le nom d'un fichier inexistant , elle retournera les infos sous forme de tableau ou chaîne suivant comment tu l'utilises. Pour le\0 les nouvelles versions de PHP savent gérer ce cas, mais bon tu peux toujours faire un remplacement (il correspond à chr(0) )

      Sinon tu as la possibilité de vérifier le type MIME avec l'extension https://www.php.net/manual/fr/book.fileinfo.php entre autres.. Tu as pléthore de liens ici et là pour faire un upload sécurisé ou utiliser des solutions existantes 

      -
      Edité par WillyKouassi 7 mai 2019 à 18:14:50

      • Partager sur Facebook
      • Partager sur Twitter
      le bienfait n'est jamais perdu
        7 mai 2019 à 16:30:43

        Je n'ai pas tout compris

        En résumé, c'est nul comme moyen de contrôle des uploads ? 

        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2019 à 3:40:40

          Bonjour.

          Ton code est partiellement incorrect, soit :

          $extension = pathinfo($file['MY_FILE'], PATHINFO_EXTENSION);

          MY_FILE est un index de la variable $_FILES et non de $file.

          -
          Edité par Lartak 9 mai 2019 à 3:41:32

          • Partager sur Facebook
          • Partager sur Twitter

          Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

            18 mai 2019 à 15:11:22

            Lartak a écrit:

            Bonjour.

            Ton code est partiellement incorrect, soit :

            $extension = pathinfo($file['MY_FILE'], PATHINFO_EXTENSION);

            MY_FILE est un index de la variable $_FILES et non de $file.

            -
            Edité par Lartak 9 mai 2019 à 3:41:32

            Oui oui c'est vrai!

            WillyKouassi a écrit:

            Salut,

            foo.min.js est un nom de fichier valide, si tu protège le premier point donc tu supposes que .js n'est pas une extension valide ? pathinfo ne sait rien du contenu, la preuve tu peux donner en argument le nom d'un fichier inexistant , elle retournera les infos sous forme de tableau ou chaîne suivant comment tu l'utilises. Pour le\0 les nouvelles versions de PHP savent gérer ce cas, mais bon tu peux toujours faire un remplacement (il correspond à chr(0) )

            Sinon tu as la possibilité de vérifier le type MIME avec l'extension https://www.php.net/manual/fr/book.fileinfo.php entre autres.. Tu as pléthore de liens ici et là pour faire un upload sécurisé ou utiliser des solutions existantes 

            -
            Edité par WillyKouassi 7 mai 2019 à 18:14:50


            Ok ok, je vois ...

            Après j'attends des fichiers image ou texte, le format monfichier.quelquechose.extension comme foo.min.js est impossible? du coup, je peux rester avec strstr? 

            les types mime sont une valeur sur ?

            -
            Edité par born1 18 mai 2019 à 16:09:32

            • Partager sur Facebook
            • Partager sur Twitter
              22 mai 2019 à 15:58:16

              C'est quoi un format impossible ? foo.min.js est un fichier avec une extension js

              -
              Edité par WillyKouassi 22 mai 2019 à 15:58:40

              • Partager sur Facebook
              • Partager sur Twitter
              le bienfait n'est jamais perdu
                22 mai 2019 à 16:20:57

                WillyKouassi a écrit:

                C'est quoi un format impossible ? foo.min.js est un fichier avec une extension js

                -
                Edité par WillyKouassi il y a 18 minutes


                Je n'ai pas dit le contraire, ma question était pour les fichiers de type texte ou image, la double extension peut elle exister ? 

                • Partager sur Facebook
                • Partager sur Twitter
                  22 mai 2019 à 16:58:00

                  C'était plus simple de tester non ? De ce que je sais,  un fichier a une extension donc tes histoires de double extension et (foo.t.n.txt) triple extension , je ne vois pas trop.

                  Edit: Pour les images on a par exemple getimagesize, sinon comme je l'ai dit tu as plein d'exemples ici et là pour faire un upload sécurisé quitte à utiliser des lib existantes 

                  -
                  Edité par WillyKouassi 22 mai 2019 à 17:03:12

                  • Partager sur Facebook
                  • Partager sur Twitter
                  le bienfait n'est jamais perdu
                    22 mai 2019 à 17:52:58

                    Bonjour.

                    Déjà, lorsque tu crées un input de type file, tu peux indiquer quel type de fichier tu acceptes, ce qui fera que lorsque l'utilisateur cliquera sur l'input et que la fenêtre d'exploration s'ouvrira pour qu'il sélectionne le fichier qu'il veut uploader, seul les fichiers de type acceptés seront affichés, il ne pourra donc pas sélectionner un de ses fichiers qui ne respectent pas le(s) types autorisés.

                    Ce qui permet déjà de faire une pré-validation.

                    Voir ici : <input type="file"> - HTML (HyperText Markup Language) | MDN » accept.

                    Cela ne remplace pas la validation côté serveur, mais tu auras au moins déjà un filtrage de ce que tu pourrais recevoir.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                    [PHP] Sécurité upload => path_info()

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown