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é PHP variable et Upload


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Points : 39
    Points
    39
    Par défaut Sécurité PHP variable et Upload
    Bonjour,

    J'ai deux questions relatives a la securité PHP :

    - Mettre un 'htmlentities' sur toutes les variables recupérées (input passé en post) est-il suffisant comme sécurité?

    - En dehors de vérifier des la taille ou l'extention d'un fichier, quel est le moyen le plus sur de securiser un upload (dans le cas present il doit s'agir uniquement de photos)

    Merci d'avance
    cam

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    htmlentities ne doit être utilisé que lorsque la donnée est affiché à l'écran.
    il n'y a pas de raison par exemple de l'utiliser quand on met la donnée dans une base.

    je dirais même que d'un point de vue sécurité, il n'y a pas de raison d'utiliser htmlentities sur une variable post , le mieux que pourrait faire l'utilisateur serait de défigurer sa propre page.

    si tu veux aller plus loin que l'extension, tu peux lire les en-tête des fichiers pour réperer leurs caractéristiques.
    par exemple sur une image JPEG, tu as l'indication JFIF.

  3. #3
    Membre confirmé Avatar de Inazo
    Profil pro
    Gérant - société de développement web
    Inscrit en
    Avril 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Gérant - société de développement web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 417
    Points : 632
    Points
    632
    Par défaut
    Bonjour à tous,

    Alors je vais rajouter un peu mon grain de sel

    1) htmlentities ou htmlspecialchars doivent être utilisées à l'affichage. Car cela protège les internautes d'attaques de type XSS voir CSRF.

    De plus si tu met tes informations dans une base de données, MySQL par exemple, il faut obligatoirement utiliser les fonctions de sécurisation tel que mysql_real_escape_string lors de la requête pour toutes les données.

    2) L'upload,

    Vaste sujet qui si je ne me trompe pas fut traité dans un tutoriel sur developpez.com. Mais pour faire cour Sabotage a raison en plus de vérifier l'extension du fichier (et là il y a moult façon de le faire) il faut en plus vérifier si les bits magique sont présent pour un gif : GIF89 (de mémoire).

    Mais en plus de cela tu dois toujours au grand toujours mettre toi même l'extension du fichier lors de ça sauvegarde. Si par exemple ton programme dit que le format du fichier suivant : "MaPhoto.gif.php" est le format GIF, tu dois toi même marquer MaPhoto.gif.php.gif, ainsi il sera impossible d'utiliser le fichier en tant que fichier php. Ok cela repose sur de très mauvaises protection en amont mais j'ai déjà vu.

    De plus il ne faut pas oublier de faire attention au NULL BYTES qui pourrait te causer bien des soucis avec un fichier du genre MaPhoto.php%00.gif

    Voila pour des bases.

    Cordialement,

  4. #4
    zesavantfou
    Invité(e)
    Par défaut
    Moi je me prend pas la tête avec ca:
    tu prend la photo tu recupère l'extension, tu vérifie avec un if si elle correspond aux formats que tu accepte, si c'est pas le cas tu annule l'upload, si c'est la cas, tu génère radicalement un nom a ta photo et tu la nomme avec:

    md5.extension que tu a récupérer.

    quand tu es un peu parano, utilise une regex pour que dès qu'il y a la suite de caractère php (ou autre ) dans le nom de la photo tu ne l'accepte pas en affichant un message d'erreur: veuillez renommer votre photo et ressayer.

    et tu ne risque rien. Mais bon si tu veut donner le maximum de confort a tes utilisateurs, fait ce que sabotage et camcam disent, c'est mieux dans ce cas.

  5. #5
    Membre confirmé Avatar de Inazo
    Profil pro
    Gérant - société de développement web
    Inscrit en
    Avril 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Gérant - société de développement web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 417
    Points : 632
    Points
    632
    Par défaut
    Le md5.extension c'est une solution valable mais un peu éloigner de la réalité des usager.

    Si l'upload du fichier doit servir à intégrer le fichier via un lien dans tu texte dans une actualité par exemple son nom est important pour l'identifier rapidement parmi plusieurs autres fichier.

    Ensuite il faut voir comment tu contrôle ton extension si tu fais le contrôle avec ce qui se trouve uniquement dans le tableau $_FILES il y a un gros soucis

    Cordialement,

  6. #6
    zesavantfou
    Invité(e)
    Par défaut
    Comment alors on fait pour se protéger contre le null byte ? on fait regex toute bete ?

  7. #7
    Membre confirmé Avatar de Inazo
    Profil pro
    Gérant - société de développement web
    Inscrit en
    Avril 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Gérant - société de développement web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 417
    Points : 632
    Points
    632
    Par défaut
    Ben en fait oui.

    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
     
            static protected function haveNullByte($val){
     
        	   if(preg_match('~(%00|0x00|\\0)~',$val))
        	  	return TRUE;
     
             	return (strpos($val,"\0") === FALSE) ? FALSE : TRUE;
    	}
     
     
     
    	static protected function cleanNullByte($val){
    		if(self::haveNullByte($val))
    			return preg_replace('~(%00|0x00|\\0)~','_',str_replace("\0",'_',$val));
     
    		return FALSE;
    	}
    Je ne sais plus de qui est ce code, un membre du forum (je m'excuse d'avance de ne pouvoir le citer), mais très efficace.

    Ne pas oublier d'utiliser la fonction trim() de PHP qui est aussi bien pratique par moment.


    Cordialement,

  8. #8
    zesavantfou
    Invité(e)
    Par défaut
    je viens de tester sur ma methode de protection (que j'ai expliqué plus haut) un fichier null byte, et bien j'ai été soulager de savoirque ca marche pour ca aussi !
    Mon script qu'on il a reçu un fichier fichier.php%00.jpg, a renommer et fait tout pour avoir au bout 1qd1q5d41q2zd1qz5d41q5.jpg tout court ! je suis soulagé XD

    Par contre le seul hic que j'ai constaté c'est que je renomme avec un md5 de 10 caractères, la j'en ai eu un en 8 caractère (comme si le null byte a été soustrait du nom).

    Mais bon je pense qu'il n'y a pas de danger puisque au bout j'ai un .jpg

  9. #9
    Membre confirmé Avatar de Inazo
    Profil pro
    Gérant - société de développement web
    Inscrit en
    Avril 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Gérant - société de développement web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 417
    Points : 632
    Points
    632
    Par défaut
    Oui la méthode de renommer permet de ne pas être gêné par le Null Bytes ou pas trop.

    Par contre si tu devais conserver le nom du fichier... Il y a de gros risque. Ensuite le plus simple et de laisser l'utilisateur saisir le nom du fichier et de faire les vérifications nécessaires sur la chaîne fournis.

    Par contre un md5 fait toujours 32 caractères à moins que tu l'ais toi même coupé mais là tu t'exposes à avoir des noms non unique.

    Cordialement,

Discussions similaires

  1. [Sécurité] php
    Par Rhadamanthe59 dans le forum Langage
    Réponses: 4
    Dernier message: 20/01/2006, 15h11
  2. [Sécurité] PHP 5 transmission de variables
    Par messier79 dans le forum Langage
    Réponses: 18
    Dernier message: 09/01/2006, 14h05
  3. [Mail] *PHP* |Variables| Mauvaise syntaxe
    Par jilibi dans le forum Langage
    Réponses: 18
    Dernier message: 15/11/2005, 18h16
  4. Réponses: 6
    Dernier message: 27/10/2005, 15h07
  5. [Sécurité] [PHP] Sécurité
    Par diaboloche dans le forum Langage
    Réponses: 5
    Dernier message: 11/10/2005, 08h42

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