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é] Classe Session réutilisable [Archives]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Avatar de Amnesiak
    Profil pro
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 151
    Points
    151
    Par défaut [Sécurité] Classe Session réutilisable
    Bonjour à tous,

    Bénéficiant d'une approche orientée objet depuis PHP5, je me suis penché sur la réalisation d'une classe Session qui aurait pour but de simplifier l'utilisation des sessions. Elle permettrait par exemple d'accéder aux variables de session à l'aide de méthode get/set, d'appeler automatiquement session_start() dans le constructeur de l'objet, et d'implémenter un petit mécanisme d'authentification.

    Bien évidemment le tout se devrait suffisamment flexible et générique afin d'être facilement réutilisable pour n'importe quel projet futur.

    La méthode login se contente d'enregistrer une variable de session spécifique (authentication_ip) qui contient l'adresse IP du client qui soumet la demande, ainsi qu'une série de variable additionelles (typiquement, ce sera l'ID du membre, le login de la personne, etc...)
    La méthode logout détruit la session
    La méthode isLogged sera utilisée pour déterminer si le client est identifié ou non. Le test se base simplement sur l'adresse IP.

    Selon vous, et tenant compte de tous les problemes de sécurité, ce dernier test est-il suffisant ? Quels sont, pour votre part, les tests que vous effectuez pour vérifier qu'un client s'est correctement identifié ?

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    class Session {
     
        function __construct() {
            session_start();
        }
     
        public function getValue($key) {
            return isset($_SESSION[$key]) ? $_SESSION[$key] : FALSE;
        }
     
        public function setValue($key, $value) {
            $_SESSION[$key] = $value;
        }
     
        public function login($pValues = array()) {
            $_SESSION['authentication_ip'] = $_SERVER['REMOTE_ADDR'];
            foreach ($pValues as $key => $value) {
                $_SESSION[$key] = $value;
            }
        }
     
        public function logout() {
            session_unset();
            session_destroy();
        }
     
        public function isLogged() {
             return isset($_SESSION['authentication_ip']) &&
                    $_SESSION['authentication_ip'] == $_SERVER['REMOTE_ADDR'];
        }
    }
    PS: Toute suggestion/amélioration/critique concernant la classe est la bievenue !

    Merci

  2. #2
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    pour securiser par l'ip moi j'utilise cette bride de code que j'ai chopé un jour sur phpbuilder.com y'a un moment de cela... php5 n'existait pas.
    a toi de travailler pour l'intégration ;-)

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    function _getIpForSecure (){
     
       if (isset ($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR']){
          $IP_ADDR = $_SERVER['HTTP_X_FORWARDED_FOR'];
       }else if (isset ($_SERVER['HTTP_CLIENT_IP']) && $_SERVER['HTTP_CLIENT_IP']){
          $IP_ADDR =  $_SERVER['HTTP_CLIENT_IP'];
       }else{
          $IP_ADDR = $_SERVER['REMOTE_ADDR'];
       }
     
       // cherche IP serveur et la traite
       $FIRE_IP_ADDR = $_SERVER['REMOTE_ADDR'];
       $ip_resolved = gethostbyaddr($FIRE_IP_ADDR);
       // construit la chaine d'identification serveur IP
       $FIRE_IP_LITT = ($FIRE_IP_ADDR != $ip_resolved && $ip_resolved) ? $FIRE_IP_ADDR." - ". $ip_resolved : $FIRE_IP_ADDR;
       // construit la chaine d'identification client IP
       $toReturn = ($IP_ADDR != $FIRE_IP_ADDR) ? "$IP_ADDR | $FIRE_IP_LITT" : $FIRE_IP_LITT;
       return $toReturn;
     
    }
     
    function getUserConnected () {
     
       $secure_with_ip_passed = 0;
     
       if(!isset($_SESSION['secure_with_ip_name'])) {
          $_SESSION['secure_with_ip_name'] = _getIpForSecure();
       }
       else {
          $secure_with_ip_passed = ($_SESSION['secure_with_ip_name'] == _getIpForSecure ());
       }   
       return $secure_with_ip_passed;
     
    }
    C'est interressant, tiens nous au courant de ton travail merci.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    La logique voudrait que ta classe soit statique ou soit un singleton, étant donné qu'on ne manipule pas des instances de sessions (on pourrait, mais le module de PHP en est incapable).
    Boost ftw

  4. #4
    Membre habitué
    Avatar de Amnesiak
    Profil pro
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 151
    Points
    151
    Par défaut
    Citation Envoyé par ska_root
    pour securiser par l'ip moi j'utilise cette bride de code que j'ai chopé un jour sur phpbuilder.com y'a un moment de cela... php5 n'existait pas.
    Merci je vais regarder comment intégrer tout ça

    Citation Envoyé par loufoque
    La logique voudrait que ta classe soit statique ou soit un singleton, étant donné qu'on ne manipule pas des instances de sessions (on pourrait, mais le module de PHP en est incapable).
    Remarque très intéressante, voici donc une version corrigée de ma classe :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    class Session { 
     
        private static $instance;
     
        public static function getInstance() {
            if (!isset(self::$instance)) {
                self::$instance = new Session();
            }
            return self::$instance;
        }
     
        private function __construct() { 
            session_start(); 
        } 
     
        public function getValue($key) { 
            return isset($_SESSION[$key]) ? $_SESSION[$key] : FALSE; 
        } 
     
        public function setValue($key, $value) { 
            $_SESSION[$key] = $value; 
        } 
     
        public function login($pValues = array()) { 
            $_SESSION['authentication_ip'] = $_SERVER['REMOTE_ADDR']; 
            foreach ($pValues as $key => $value) { 
                $_SESSION[$key] = $value; 
            } 
        } 
     
        public function logout() { 
            session_unset(); 
            session_destroy(); 
        } 
     
        public function isLogged() { 
             return isset($_SESSION['authentication_ip']) && 
                    $_SESSION['authentication_ip'] == $_SERVER['REMOTE_ADDR']; 
        } 
    }
    Quelqu'un a-t-il d'autres suggestions ou remarques en tous genres : Merci

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    il y a déjà eu une discution à ce sujet dans le post-it suivant :
    http://www.developpez.net/forums/viewtopic.php?t=202446

  6. #6
    Membre habitué Avatar de kanzarih
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2002
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2002
    Messages : 327
    Points : 197
    Points
    197
    Par défaut
    Salut a tous
    bon voila, j'ai vu un code qui me fait tourner la tête !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Session { 
     
        private static $instance;
     
        public static function getInstance() {
            if (!isset(self::$instance)) {
                self::$instance = new Session();
            }
            return self::$instance;
        }
    ...
    je pense que la fonction getInstance() ne retourne pas une instance de session! mais elle crée une nouvelle (déjà avec une nouvelle variable $instance vide) non?

    en plus je ne voit pas l'utilité vu que vous allez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    $masession = new session;
    $manouvellesession = $masession->getinstance();
    ...
    alors pourquoi crée une instance a partir d'une déjà crée et dont vous posséder déjà une référence sur elle?

    corrigez moi si...!

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    ça ne fonctionne pas comme ça. La méthode getInstance est statique, ce qui permet de l'utiliser sans avoir à instancier au préalable (en fait, elle sert à instancier). De plus, elle ne crée une nouvelle instance que si il n'en existe pas déjà une.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    @kanzarih: C'est un Singleton

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/05/2007, 14h29
  2. [Sécurité] les sessions ne s'ouvrent pas
    Par bebas dans le forum Langage
    Réponses: 3
    Dernier message: 10/05/2007, 23h16
  3. [MySQLi] Classe Session, problèmes Help !
    Par sirbaldur dans le forum Requêtes
    Réponses: 1
    Dernier message: 27/11/2006, 09h43
  4. [Sécurité] Effacer sessions stockées sur serveur web
    Par rollbich dans le forum Langage
    Réponses: 2
    Dernier message: 05/10/2006, 13h20
  5. [Sécurité] Sécurité des sessions
    Par nerik38 dans le forum Langage
    Réponses: 2
    Dernier message: 01/12/2005, 14h41

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