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é] Question sécurité PHP


Sujet :

Langage PHP

  1. #1
    En attente de confirmation mail
    Inscrit en
    Novembre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut [Sécurité] Question sécurité PHP
    Bonjour à tous,

    Je suis actuellement en train de développer un site et je me pose quelques questions quant à la sécurité de celui-ci.

    Tout d'abord, j'aimerais savoir s'il est nécessaire de sécurisée une valeur d'un formulaire si on l'utilise dans une condition ou si PHP le fait automatiquement.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (!empty($_POST['test']) AND htmlentities($_POST['test'])=='truc')
    {
    ...
    }
    Ensuite j'aimerais aussi savoir s'il est préférable d'utiliser mysql_real_escape_string(); ou htmlentitites(); pour tout ce qui est récupération de données d'un formulaire. Actuellement j'utilise uniquement mysql_real_escape_string(); mais bon avec toutes ces commandes de protection qu'il existe je ne sais plus trop laquelle utiliser ^^

    Pour finir j'ai développé un espace membre. J'enregistre le login et le mot de passe dans un cookie. Le problème c'est que j'ai souvent besoin de récupérer l'ID du compte donc je dois faire une requête SQL à chaque fois. J'ai donc trouver la solution de récupérer à chaque fois l'ID du membre une seule fois au début de la page et de l'enregistrer dans une session. Est-ce un bon choix ?

    Ah j'oubliais aussi, les membres peuvent upload un avatar. Cependant pour éviter tout conflit de nom de fichier et surtout pour éviter d'utiliser la base de données je renomme chaque image par l'ID du membre. Mais je n'y mets pas d'extention. Est-ce un gros problème sachant que les images s'affichent correctement ?

    Voilà merci d'avance pour vos réponses et bonne journée

  2. #2
    Expert éminent sénior

    Avatar de Deepin
    Homme Profil pro
    Ingénieur - Chef de projet Modélisation/Simulation
    Inscrit en
    Avril 2004
    Messages
    3 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Ingénieur - Chef de projet Modélisation/Simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 164
    Points : 51 026
    Points
    51 026
    Par défaut
    voici une fonction sympa pour verifier la valeur de ton post
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function getPost($post){
    	if(isset($_POST[$post]) && $_POST[$post] != '' ){
    		return $_POST[$post];
    	}
    	return false; 
     
    }
    Pour eviter les injections tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $username =mysql_real_escape_string(htmlentities($_POST['username']));
    le stockage de l ID en session me parait etre un bon choix
    par contre stocker le password dans un cookie ma pas l air genial.
    Pour l avatar la solution est bonne.
    A++

  3. #3
    En attente de confirmation mail
    Inscrit en
    Novembre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par buns
    voici une fonction sympa pour verifier la valeur de ton post
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function getPost($post){
    	if(isset($_POST[$post]) && $_POST[$post] != '' ){
    		return $_POST[$post];
    	}
    	return false; 
     
    }
    Pour eviter les injections tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $username =mysql_real_escape_string(htmlentities($_POST['username']));
    le stockage de l ID en session me parait etre un bon choix
    par contre stocker le password dans un cookie ma pas l air genial.
    Pour l avatar la solution est bonne.
    A++
    Bonsoir buns,

    Tout d'abord merci ta réponse ;-)
    Mon problème n'était pas vraiment pour vérifier la valeur d'un formulaire mais plus savoir si il était nécessaire de mettre la fonction mysql_real_escape_string(); dans la condition.

    Ensuite pour éviter les injections est-il vraiment nécessaire d'utiliser mysql_real_escape_string(); et htmlentities(); ? Les deux fonctions ont la même fonction je crois.

    Pour mes cookies, je stocke le login & le mot de passe (crypté en md5) dans des cookies et ma page index.php (la principale puisque tout passe par la) vérifie avant quoi que ce soit que le login/mot de passe correspondent, sinon ca supprime les cookies et actualise la page. Donc je ne pense pas qu'il y ait de problème avec ça.

  4. #4
    Expert éminent sénior

    Avatar de Deepin
    Homme Profil pro
    Ingénieur - Chef de projet Modélisation/Simulation
    Inscrit en
    Avril 2004
    Messages
    3 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Ingénieur - Chef de projet Modélisation/Simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 164
    Points : 51 026
    Points
    51 026
    Par défaut
    hello,
    Regarde ce lien cela va surement t'aider a comprendre les deux fonctions.
    http://richardkmiller.com/blog/archi...l-php-security
    A++

    PS: je ne crois que tu aie a utiliser htmlentities() dans ta condition.J'ai jamais vu ça.

  5. #5
    Membre averti Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Points : 357
    Points
    357
    Par défaut
    Hello,
    Je te conseil aussi de regarder ce tutorial fait par un membre de developpez, tu en apprendra beaucoup sur les types d'attaques que peut subir un site web :
    http://julien-pauli.developpez.com/t...-web-securite/

    Bonne lecture
    ++
    ShinJava

  6. #6
    Membre régulier Avatar de The Nux
    Profil pro
    Inscrit en
    Février 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 79
    Points : 88
    Points
    88
    Par défaut
    Salut,

    Pour répondre à tes questions en t'évitant le cour (même si c'est quand même conseillé de le lire), déjà je peut te dire que le htmlentities ou une quelconque protection des valeurs dans une comparaison est complètement inutile. En revanche, ce qu'il ne faut jamais oublier, c'est d'utiliser l'opérateur identique === au lieu de l'opérateur égal ==. Pourquoi ? À cause de la conversion implicite des types de variables. Essayes par exemple de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    if (0 + 0 == "la tête à toto") echo "C'était donc vrai !";
    else echo "Que des cracks";
    ?>
    À cause de la conversion implicite des types on a vu des failles monumentales, comme par exemple une faille qui permetait de devenir administrateur d'un phpbb en modifiant son numero de session...
    Par contre, toutes les variables de $_GET ou $_POST par exemple sont de type string, ce qui veut dire qu'il ne faut pas oublier de les convertir en integer si il faut les comparer à un numéro, ou quoi que ce soit dans ces eaux là.

    En ce qui concerne le mysql_real_escape_string() VS htmlentities(), les deux sont nécessaires dans la plupart des cas, mais pas pour les mêmes raisons. Le premier, mysql_real_escape_string(), sert à empêcher les injections SQL, il est donc primordial de traiter toute valeur insérée dans mysql avec cette fonction (attention cependant aux altercations avec les magic_quote. Le mieux est dans un premier temps d'enlever les éventuelles quotes magiques avec stripslashes() pour ensuite traiter la valeur avec mysql_real_escape()). htmlentities() quand à lui sert à transformer les caractères html spéciaux en entité html. L'utilité est que cela empêche l'utilisateur de mettre du HTML dans son contenu, ce qui peut lui permettre de faire du cross scripting. On traitera donc avec htmlentities() les données que l'on compte afficher sur une page HTML et qui ont été écrites par un auteur en lequel on n'a pas confiance. Il n'est pas obligatoire de traiter les données insérées dans la base de données avec htmlentities(), par contre, si on veut protéger son site du XSS alors il faut obligatoirement traiter toutes les valeurs qui proviennent d'auteurs auxquels on ne fait pas confiance avec htmlentities() avant l'affichage. Le fait de le faire à l'insertion des données dans la BDD permet de ne pas oublier quand on affiche, mais on peut par exemple ne pas vouloir dénaturer le contenu...

    Pour résumer :
    - mysql_real_escape() pour protéger des injections SQL
    - htmlentities() pour protéger du XSS

    Concernant les sessions, c'est une très mauvaise idée de mettre le login et le mot de passe dans le cookie car ça veut dire qu'ils vont transiter en clair sur le réseau à chaque fois que l'utilisateur va ouvrir une page. Le plus simple est je pense d'utiliser le mécanisme de sessions proposé par PHP, ou un mécanisme similaire (c'est à dire que tu donnes à chaque visiteur un numero de session unique, et tu stockes dans une base de données toutes les variables que tu veux en les associant à ce numero de session). Tu peux stocker par exemple juste l'ID de l'utilisateur et récupérer toutes les infos sur lui au début de chaque page (t'en fais pas, mysql c'est très performant).

    Pour les avatars ça peut aller mais c'est pas top, avec l'extension ça serai mieux, car en fait l'extension permet que le serveur dise au navigateur le format de l'image et donc que le navigateur se prépare à afficher une image, tandis que sans extension le serveur ne sait pas et donc le navigateur ne sait pas non plus, ce qui peut produire des résultats bizarres, comme par exemple l'apparition d'une fenêtre "télécharger le fichier". Par contre fait attention que ce que les utilisateurs envoient c'est bien une image (en utilisant les librairies de PHP prévues à cet effet, pas seulement en regardant l'extension), et non pas un script php par exemple.

  7. #7
    En attente de confirmation mail
    Inscrit en
    Novembre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut
    Un grand merci à toi The Nux!
    J'ai bien lu les articles à propos de la sécurité mais ils ne sont pas toujours clair, au lieu d'en venir à l'essentiel comme tu viens de le faire. Encore merci

  8. #8
    En attente de confirmation mail
    Inscrit en
    Novembre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut
    Re bonjour,

    J'aurais besoin d'une petite précision. Tu m'as dit que je devais utiliser '===' plutôt que '==' et qu'il était préférable de définir le type de variable.
    Il faut donc que je change, par exemple, mon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (!empty($_POST['log']) AND $_POST['log']==1 AND !empty($_POST['login']) AND !empty($_POST['pwd']))
    {
      // Désidentification
    }
    par quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (!empty($_POST['log']))
      {
        $log = $_POST['log'];
        settype($log, 'integer');
      }
      if (!empty($log) AND $log===1 AND !empty($_POST['login']) AND !empty($_POST['pwd']))
      {
         // Désidentification
      }
    J'ai bien comprit la chose ou bien je suis a côté de la plaque ?

    (Je pense que je vais reposer quelques questions ces jours-ci car je revois tout mon code)

  9. #9
    Membre régulier Avatar de The Nux
    Profil pro
    Inscrit en
    Février 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 79
    Points : 88
    Points
    88
    Par défaut
    Comme ça ça marche, mais tu peux faire plus simple ^^

    Pour commencer, le !empty($_POST['log']) n'est pas très utile, par ce que si $_POST['log'] === 1 alors ça veut dire que $_POST['log'] n'est pas vide (c'est logique quoi).

    Ensuite, pour faire une conversion de type ce n'est pas obligatoire de faire ça avec settype. Par exemple là tu pourrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((int)$_POST['log'] === 1)
    Ou dans le cas général, pour convertir une variable tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $var_convertie = (type_que_je_veux) $var_pasconvertie;
    Et pour finir, je pense que c'est plus simple (et plus rapide en terme de temps d'execution) de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($_POST['log'] === "1")
    Mais ça marche aussi bien que l'autre.

    Cependant c'est bien t'a compris le principe

  10. #10
    En attente de confirmation mail
    Inscrit en
    Novembre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut
    Si je mets la condition sans être sur que la valeur du formulaire n'est pas vide j'ai une notice qui s'affiche :
    Notice: Undefined index: log in d:\sites\easyphp\www\template\index.php on line 22
    C'est donc pour celà que j'utilise toujours !empty() avant de vérifier la valeur.

  11. #11
    Membre régulier Avatar de The Nux
    Profil pro
    Inscrit en
    Février 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 79
    Points : 88
    Points
    88
    Par défaut
    Ah... J'avais oublié que ça produit une NOTICE... Mais c'est rare que les NOTICE s'affichent en fait, généralement le niveau de rapport d'erreurs est pas si élevé.

  12. #12
    En attente de confirmation mail
    Inscrit en
    Novembre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut
    Tu m'as précisé de plutôt utiliser les sessions aux cookies, chose que j'ai faite. J'ai suivi un tutorial permettant de créer un système de sessions via ma base de données (http://a-pellegrini.developpez.com/t...hp/session-db/). Cependant j'aimerais que l'utilisateur reste identifié plusieurs jours.
    J'ai fait quelques recherches afin de lié sessions & cookies mais j'ai rien trouvé. Est ce que quelqu'un aurait un tutorial la dessus ou pourrait m'expliquer le fonctionnement ?

  13. #13
    Membre régulier Avatar de The Nux
    Profil pro
    Inscrit en
    Février 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 79
    Points : 88
    Points
    88
    Par défaut
    Il te suffit juste de paramétrer le cookie de session comme il faut, à l'aide de la fonction session_set_cookie_params()

    Par exemple, pour que l'utilisateur reste connecte 7 jours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    session_set_cookie_params(604800);
    ?>

  14. #14
    En attente de confirmation mail
    Inscrit en
    Novembre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut
    Ah vraiment tout bête, je n'ai même pas pensé à chercher si les sessions le permettait tout simplement. Merci!

  15. #15
    En attente de confirmation mail
    Inscrit en
    Novembre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut
    Bonsoir,

    Comme prévenus, je reviens demander de l'aide
    Ce que je vais demandé n'est pas dans la bonne catégorie du forum puisque cela concerne AJAX mais je ne voulais pas ré-ouvrir un sujet, je préfère continuer dans celui-ci. Donc venons-en au problème.

    Je suis en train de développer un site avec la technologie AJAX en supplément. Je m'en sers pour charger mes pages, comme si j'utilisais des frames. Cependant lorsque la page demandée se charge, tous les caractères spéciaux sont remplacés par des points d'interrogation et la page demandée ne prend pas en compte la feuille de style déjà chargée dans la page index.

    Si quelqu'un à des solutions à me proposer je le remercie d'avance, sinon et bien je n'utiliserai pas cette méthode tout simplement.

    Bonne fin de journée à tous.

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

Discussions similaires

  1. Petite question pour faire comme en php
    Par MeTaLCaM dans le forum ASP.NET
    Réponses: 5
    Dernier message: 01/06/2009, 12h28
  2. Question pour un champion -> redirection php
    Par autofill dans le forum Langage
    Réponses: 7
    Dernier message: 09/04/2009, 15h52
  3. [Question] Logs mysql et scripts php
    Par sliderman dans le forum Requêtes
    Réponses: 0
    Dernier message: 25/10/2007, 15h39
  4. Pour vos questions scripts de Newsletter pour PHP
    Par Marc Lussac dans le forum E-Mailing
    Réponses: 0
    Dernier message: 25/08/2007, 16h19
  5. [PHP-JS] Question sur la syntaxe entre PHP et HTML
    Par Diabless6 dans le forum Langage
    Réponses: 8
    Dernier message: 13/04/2007, 13h08

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