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 :

file_get_contents sur une image et analyse du code pour protection du serveur


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut file_get_contents sur une image et analyse du code pour protection du serveur
    Bonjour,

    J'ai entendu dire que quand on récupérait des images sans passer par l'upload classique (donc des images distantes via file_get_content par exemple), il fallait les analyser pour voir si elles ne contenaient pas de code malvaillant (des scripts php ou autre).

    Ainsi est ce que vérifier la présence de "<?", "?>","<script" et "script>" suffit à m'assurer que l'image que je vais récupérer est saine ?

    Je fais ceci (je sais j'aurai pu utiliser un switch mais c'est pour l'exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $imgDistante = file_get_contents("http://www.toto.com/images/titi.jpg");
    // je veux m'assurer que titi.jpg ne contient pas de code malvaillant
    if(substr_count($fic_img , "<?" ) > 0 || substr_count($fic_img , "?>" ) > 0 || substr_count($fic_img , "<script" ) > 0 || substr_count($fic_img , "script>" ) > 0){echo "erreur";}
    else
    {
    file_put_contents($imgRenomee, $imgDistante);		
    }
    Est ce correct ?
    Y a t-il d'autres occurences à vérifier pour sécuriser la copie des fichiers distants ?

    Merci d'avance

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Perso, jamais vu qu'il fallait vérifier le contenu d'un fichier de cette manière, pour éviter qu'il y ait du code farfelu dedans. A priori, si tu l'enregistres avec une extension d'image, ce sera jamais exécuté comme script PHP par ton serveur, donc pas de risque.

    Dans ce tutoriel là : http://antoine-herault.developpez.co...p/upload/#L3.2, ils parlent de la sécurité lors de l'upload, et disent rien de particulier à ce sujet.

    Mais si quelqu'un d'autre pouvait confirmer, ce serait mieux...

    RQ : Ta technique pour vérifier la présence de script me semble pas mal, mais qui sait, peut être que dans certaines images, on retrouve les caractères "<?" par pur hasard ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Humm j'ai fais plusieurs test et je n'ai jamais trouvé de <?.

    En réalité ce n'est pas un upload Climoo, c'est juste une copie d'un fichier distant (de plusieurs fichiers en fait).
    J'ai tellement peur que lorsque je mettrai ce genre de service, certains s'en servent pour toruver des failles de sécurité, du coup je suis hyper vigilant.

    Le tuto de Antoine Herault ne protège en rien l'upload. C'est juste un everif mineure tout comme le javascript sur des formulaire. C'est plus pour du confort utilisateur.

    Bon, si quelqu'un d'autre pouvait me dire ce qu'il en pense...

    Merci Climoo pour t aréponse, j'attends d'autres avis.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Bon je demande un petit up s'il vous plait.

    J'ai fais quelques tests et manque de chance j'ai bien détecté une fois <? dans une image par pur hasard. Cela dit jemais je n'ai rencontré <?php

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    La seule solution , pour être certain que ton image est une image est de la retraitée avec GD (par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    file_put_contents('tmp/vulnerable.png',file_get_contents('http://site.com/image.png'));
    $img = imagecreatefrompng('tmp/vulnerable.png'); 
    imagepng($img, 'safe.png');
    unlink('tmp/vulnerable.png');
    Si le processus echoue c'est que ton image n'est pas valide.

    Tu peux également utiliser getImageSize() , mais je suis pas certains à 100% que ça échoue sur une image qui inclus des scripts
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Merci pour ta solution grunk, peux tu m'expliquer en quoi ça consiste ? Je ne vois pas très bien en quoi ton code empecherait un script de passer incognito...

    Sinon j'avais pensé faire un vilain
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str_replace('<?','',$mon_image);
    En effet l'occurence '<?' est rare et même si elle apparait 2 ou 3 fois, supprimer moins de 10 caractères n'altèrera pas l'image et ne l'empêchera pas de s'afficher... et ça empêchera le code php de s'exécuter.

    Qu'en pensez vous ?

    C'est fou quand meme que rien n'a été fait "expret" pour certifier qu'une image soit saine.


    EDIT: arf, en fait supprimer 3 ou 4 caracteres détériore l'image.

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Merci pour ta solution grunk, peux tu m'expliquer en quoi ça consiste ?
    Si tu télécharge un fichier en .png , qui à un mimetype image/png mais qui ne contient pas de données image , imagecreatefrompng() échouera.

    Si l'image est présente mais contient un script , imagecreatefrompng() passera mais imagepng() réencodera l'image et donc le script contenu à l'intérieur.

    Fait l'essai en ajoutant un script à la fin d'une image , tu verras qu'après cette petite moulinette , le script est ré encoder au sein de l'image sous forme de données image binaire , il est donc inexploitable.

    Le problème c'est que tu vas consommer plus de ressource (à cause de l'encodage de l'image) et tu peux potentiellement perdre (un peu) en qualité , GD n'étant pas réputé pour cela.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    J'avais aussi pensé à ajouter un ou deux pixel dans l'image avec ImageSetPixel().
    Sinon l'idée est bien mais en sachant que je ne suis pas expert en GD et que les images récupérées seront forcément des jpg, quelles fonctions me conseilles tu d'équivalente à :
    imagecreatefrompng(), imagepng().
    Peut etre imagecreatefromjpg(), imagejpg() ?

    Sinon on peut également redimensionner l'image pour que les potentiels scripts soient virés...

    EDIT: j'ai trouvé c'est ImageCreateFromJpeg() et ImageJpeg(). Merci encore
    Je mets ceci en Résolu.
    bonne journée !

  9. #9
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par ghostfile Voir le message
    Peut etre imagecreatefromjpg(), imagejpg() ?
    Presque juste penser à rajouter le paramètre de qualité pour ne pas trop compresser l'image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    file_put_contents('tmp/vulnerable.jpg',file_get_contents('http://site.com/image.jpg'));
    $img = imagecreatefromjpeg('tmp/vulnerable.jpg'); 
    imagejpeg($img, 'safe.jpg',100);
    imagedestroy($img);
    unlink('tmp/vulnerable.jpg');
    Le redimensionnement est aussi une solution.

    Voir la doc pour plus d'infosur GD : http://www.php.net/manual/en/ref.image.php
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Merci

    Nos messages ce sont croisés.

    Bon vu que je redimensionne quasi toujours mes images pour X pixel de largeur max, je vais juste ajouter une contidion si l'image source à une $largeurSource égal à $largeurMax alors largeurMax = $largeurMax-$nbAlea, histoire qu'il n'y a pas un petit malin qui met volontairement une image aux bonnes dimensions pour ne pas qu'elle soit redimensionnée :p

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/01/2015, 16h00
  2. Réponses: 1
    Dernier message: 28/09/2010, 12h13
  3. Réponses: 6
    Dernier message: 15/11/2007, 12h31
  4. Zoom sur une image
    Par AurelBUD dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/05/2004, 17h05
  5. Comment mettre un label sur une image
    Par dug dans le forum MFC
    Réponses: 3
    Dernier message: 07/04/2004, 10h40

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