IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sécurité contre injection de code dans upload


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de langevert
    Profil pro
    Inscrit en
    Août 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 92
    Points : 71
    Points
    71
    Par défaut Sécurité contre injection de code dans upload
    Bonjour,

    J'ai crée en PHP un système d'upload d'images.
    Pour des raisons de sécurité, j'ai décidé de refuser toutes les images dont les 1ers octets (numéro magique) ne correspondent pas à une image jpeg ou gif.

    Seulement cette protection ne suffit pas : En effet, un fichier peut débuter avec le numéro magique d'un gif (et sera donc accepté), puis peut être suivi de code malicieux comme du PHP...

    Pour éviter ce problème, j'ai procédé comme cela:
    - Les fichiers uploadés sont stockés en dehors du répertoire web (donc pas accessible directement)
    - J'ai crée un fichier image.php?name=image_name , dont voici une version simplifiée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $name = $_GET['name'];
    $pic =  '/myFolder/'.$name;
    /*Note: On teste le nom du fichier pour savoir si il existe, et pour protéger de tout parcours de répertoire (autoriser uniquement des fichiers existants qui sont dans un répertoire précis)  -- Pas précisé ici toutes les vérifications pour alléger l'exemple*/
     
    header("Content-Type: image/gif");   //ou jpeg si jpeg
     
    readfile($pic);
    Puis donc après dans ma page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <img src="image.php?name=image_18" alt="mon image"/>
    Le problème est donc résolu.
    J'aimerai ensuite créer des miniatures. J'aimerai savoir si le code suivant protége aussi contre une telle faille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    //On récupere le nom du fichier à afficher (avec les memes protection que citées dans le code précédént)
    $name = $_GET['name'];
    $pic =  '/myFolder/'.$name;
     
    header("Content-Type: image/gif");   //ou jpeg si jpeg
     
    //On récupère les infos sur l'image
    $info_img = @getimagesize($pic);
     
    if(!$info_img )
    {
        exit();
    }
     
    //Creation de la miniature
    $img_out = imagecreatetruecolor(100, 100);
    $img_in = imagecreatefromgif($pic);
    imagecopyresampled($img_out, $img_in, 0, 0, 0, 0, imagesx($img_out), imagesy($img_out), imagesx($img_in), imagesy($img_in));
    imagegif($img_out);

    Autre petite question: De telles protection empecherait par exemple l'éxécution de code PHP. Mais est-ce pareil pour du code JS? (faille XSS). Si non, comment protéger?

    Merci d'avance pour vos réponses.

  2. #2
    Membre confirmé Avatar de d-Rek
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2007
    Messages : 438
    Points : 455
    Points
    455
    Par défaut
    Pour ne pas te poser de soucis après coup, il faut verrouiller ton système à l'upload. Quand tu reçois un fichier, vérifier plutôt le mime-type afin qu'il soit en accord avec l'extension.
    Exemple, j'ai un fichier PHP, je le renomme en .gif, l'upload fonctionne mais si j'appelle l'URL du fichier gif, ton serveur renvoie une entête image/gif : l'image ne s'affiche pas, le code ne s'exécute pas.

    On obtiens le Mime-type ainsi : $_FILES['mon_fichier']['type']
    En gros :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ?php
    $extensions_auth = array('jpg', 'jpeg', 'gif', 'png', 'bmp');
    if(in_array(substr(strrchr(strtolower($_FILES['mon_fichier']['name']), '.'), 1), $extensions_auth) AND substr(strtolower($_FILES['mon_fichier']['type']), 0, 6)=='image/'){
    	// mimeType & extension pour image alors ok on fait un move_uploaded_file vers un répertoire web accessible
    }
    ?>

  3. #3
    Membre régulier Avatar de langevert
    Profil pro
    Inscrit en
    Août 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 92
    Points : 71
    Points
    71
    Par défaut
    Merci pour votre réponse.
    Par contre, par simple curiosité avez-vous la réponse aux questions?

    Quand vous dites d'utiliser la variable $_FILES['mon_fichier']['type'], je ne trouve pas très sécurisé car cette variable n'est pas forcement correcte (facile à changer par le client)

  4. #4
    Membre régulier
    Profil pro
    rfv
    Inscrit en
    Novembre 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : rfv

    Informations forums :
    Inscription : Novembre 2006
    Messages : 91
    Points : 115
    Points
    115
    Par défaut
    Effectivement il ne faut absolument pas se fier au type MIME ($_FILES['mon_fichier']['type']) que l'on peut fausser vis a vis du vrai contenu du fichier !

    Par contre j'ai trouvé un site pas mal qui se pose les mêmes problématiques de sécurité d'upload et download de fichiers en évitant les injections PHP.

    A ce que j'en ai compris, l'idéal est de configurer Apache de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # Forcer le téléchargement du fichier
            ForceType application/force-download
    Ou tel que le fait Comment forcer le téléchargement d'un fichier ? ( Header, FilesMatch ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <IfModule mod_headers.c>
    	<FilesMatch "\.(jpe?g)$">
    		ForceType image/jpeg
    		Header set Content-Disposition attachment
    	</FilesMatch>
    </IfModule>

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/09/2013, 16h18
  2. Injection de code dans le .htaccess
    Par reureureu dans le forum Sécurité
    Réponses: 8
    Dernier message: 19/01/2013, 16h52
  3. injection de code dans fichier PE
    Par _ky_ dans le forum C
    Réponses: 16
    Dernier message: 27/01/2007, 19h38
  4. Réponses: 24
    Dernier message: 13/12/2006, 13h54
  5. injection de code dans une application
    Par youp_db dans le forum C
    Réponses: 16
    Dernier message: 21/07/2006, 12h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo