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 :

[Cookies] Sessions PHP et utilisateurs AOL


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut [Cookies] Sessions PHP et utilisateurs AOL
    Bonsoir,

    J’ai une petite question concernant les sessions PHP et les utilisateurs d’AOL.

    J’ai créé un site ou les visiteurs peuvent accéder à un espace membre protégé par un système de session PHP. Tout fonctionne bien. De manière générale, les utilisateurs ne rencontrent pas de problèmes. Mais je reçois de temps en temps des mails de personnes me disant ne pas arriver à se connecter à mon espace membre.

    Après avoir regroupé toutes ces plaintes, je me rends compte que toutes ces personnes sont des utilisateurs d’AOL.

    Voici le système que j’utilise :

    1. Je demande via un formulaire leur login et leur mot de passe
    2. Je me connecte à ma base de donnée (MySQL) pour vérifier si le login et le mot de passe correspondent bien.
    3. Si tout est ok, j’utilise le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // c'est se que l'on ma conseiller de mettre sinon, mes pages n'étaient pas valides W3C
    ini_set("url_rewriter.tags","a=href,area=href,frame=src,iframe=src,input=src");
     
    // Vous savez se que c'est ;-)
    session_start();
     
    //“$id” provient de ma base SQL. C’est l’identifiant unique de l’utilisateur
    $_SESSION['id'] = $id;
    )

    4. Sur chaque page de mon espace sécurisé, j’utilise le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ini_set("url_rewriter.tags","a=href,area=href,frame=src,iframe=src,input=src");
    session_start();
    if($_SESSION['id'] == "") { 
    	header('location: login.php');
    	exit; }
    Est-ce que quelqu'un pourrait me dire se qui ne va pas ?

    D'avance un tout grand merci pour votre aide.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Points : 1 504
    Points
    1 504
    Par défaut
    C'est AOL qui ne va pas, ils ont un système de gestion de sessions qui réinitialise ta session quasiment à toutes les pages. J'ai deja eu ce problème et je n'y ai pas trouvé de solutions.
    Sur le site d'aol, si je me souviens bien, il préconisait de passer le sid dans les url (ce qui evidemment, foutait en l'air la qualité de mon rewriting). Bref, si quelqu'un a une solution assez propre, je suis preneur moi aussi.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Points : 1 504
    Points
    1 504
    Par défaut
    Bon, je viens de bosser sur le sujet vu que je trainais ca dans un "todo", voici ce que j'ai pu comprendre.
    Le systeme de session n'est pas défaillanet que sur AOL mais aussi sur d'autres FAI. En fait, pour faire court, il s'agit d'un non respect des normes OSI qui causent ce problème de gestion des sessions.
    Le fait de passer le sid dans l'url permet de résoudre ce problème mais lorsque l'on fait du rewriting d'url, c'est vraiment pas beau.

    Donc, une autre solution consiste à gérer ses sessions via son propre gestionnaire.

    Voici donc le code d'un gestionnaire de sessions (qui marche je l'ai testé) mais qui nécessite mysql (tu peux stocker dans des fichiers texte si tu préfère en modifiant un peu le code suivant).

    Code de la classe sessions :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    <?php
     
    /* Create new object of class */
    $ses_class = new session();
     
    /* Change the save_handler to use the class functions */
    session_set_save_handler (array(&$ses_class, '_open'),
                              array(&$ses_class, '_close'),
                              array(&$ses_class, '_read'),
                              array(&$ses_class, '_write'),
                              array(&$ses_class, '_destroy'),
                              array(&$ses_class, '_gc'));
     
    /* Start the session */
    session_start();
     
    class session
    {
        /* Define the mysql table you wish to use with
           this class, this table MUST exist. */
        var $ses_table = "sessions";
     
        /* Change to 'Y' if you want to connect to a db in
           the _open function */
        var $db_con = "Y";
     
        /* Configure the info to connect to MySQL, only required
           if $db_con is set to 'Y' */
        var $db_host = "mysql5-3";
        var $db_user = "chaletde001";
        var $db_pass = "FGpBz2lx";
        var $db_dbase = "chaletde001";
     
        /* Create a connection to a database */
        function db_connect() {
            $mysql_connect = @mysql_pconnect ($this->db_host,
                                              $this->db_user,
                                              $this->db_pass);
            $mysql_db = @mysql_select_db ($this->db_dbase);
     
            if (!$mysql_connect || !$mysql_db) {
                return FALSE;
            } else {
                return TRUE;
            }
        }
     
        /* Open session, if you have your own db connection
           code, put it in here! */
        function _open($path, $name) {
            if ($this->db_con == "Y") {
                $this->db_connect();
            }
     
            return TRUE;
        }
     
        /* Close session */
        function _close() {
            /* This is used for a manual call of the
               session gc function */
            $this->_gc(0);
            return TRUE;
        }
     
        /* Read session data from database */
        function _read($ses_id) {
            $session_sql = "SELECT * FROM " . $this->ses_table
                         . " WHERE ses_id = '$ses_id'";
            $session_res = @mysql_query($session_sql);
            if (!$session_res) {
                return '';
            }
     
            $session_num = @mysql_num_rows ($session_res);
            if ($session_num > 0) {
                $session_row = mysql_fetch_assoc ($session_res);
                $ses_data = $session_row["ses_value"];
                return $ses_data;
            } else {
                return '';
            }
        }
     
        /* Write new data to database */
        function _write($ses_id, $data) {
            $session_sql = "UPDATE " . $this->ses_table
                         . " SET ses_time='" . time()
                         . "', ses_value='$data' WHERE ses_id='$ses_id'";
            $session_res = @mysql_query ($session_sql);
            if (!$session_res) {
                return FALSE;
            }
            if (mysql_affected_rows ()) {
                return TRUE;
            }
     
            $session_sql = "INSERT INTO " . $this->ses_table
                         . " (ses_id, ses_time, ses_start, ses_value)"
                         . " VALUES ('$ses_id', '" . time()
                         . "', '" . time() . "', '$data')";
            $session_res = @mysql_query ($session_sql);
            if (!$session_res) {    
                return FALSE;
            }         else {
                return TRUE;
            }
        }
     
        /* Destroy session record in database */
        function _destroy($ses_id) {
            $session_sql = "DELETE FROM " . $this->ses_table
                         . " WHERE ses_id = '$ses_id'";
            $session_res = @mysql_query ($session_sql);
            if (!$session_res) {
                return FALSE;
            }         else {
                return TRUE;
            }
        }
     
        /* Garbage collection, deletes old sessions */
        function _gc($life) {
            $ses_life = strtotime("-5 minutes");
     
            $session_sql = "DELETE FROM " . $this->ses_table
                         . " WHERE ses_time < $ses_life";
            $session_res = @mysql_query ($session_sql);
     
     
            if (!$session_res) {
                return FALSE;
            }         else {
                return TRUE;
            }
        }
    }
    ?>
    Ensuite le code de la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE sessions (
       ses_id varchar(32) NOT NULL default '',
       ses_time int(11) NOT NULL default '0',
       ses_start int(11) NOT NULL default '0',
       ses_value text NOT NULL,
       PRIMARY KEY  (ses_id)
    ) TYPE=MyISAM;
    Puis, dans ton code, tu fais require_once("sessions.conf.php") au début de tes scripts qui ont besoin de sessions et c'est parti ! Tu n'as pas besoin de changer quoique ce soit d'autres dans ton code (si ce n'est de retirer les session_start() car le sessions_start est fait dans le sessions.conf.php).

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 393
    Points : 15 754
    Points
    15 754
    Par défaut
    Citation Envoyé par Raideman Voir le message
    il s'agit d'un non respect des normes OSI qui causent ce problème de gestion des sessions.
    quel est le point qui pose problème dans la configuration par défaut de PHP ?

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Points : 1 504
    Points
    1 504
    Par défaut
    Le problème ne vient pas de php mais plutot de la gestion des sessions. Je vais essayer de m'expliquer sans dire trop d'aneries (c'est pas gagné !).

    La gestion des états de sessions *peut* se baser sur l'adresse IP source des requêtes web. En gros dans ce shéma, on a la sessions qui dépend (entre autres) de l'adresse IP source.

    Hors les cas sont nombreux où l'adresse IP d'un visiteur peut changer durant la navigation. Dans le monde de l'entreprise notamment, il y a beaucoup de systèmes de proxy http ou de système de "load balancing" qui modifient l'IP source. C'est le cas, il me semble pour les utilisateurs d'AOL et bien d'autres d'ailleurs. C'est pour celà qu'il est recommandé pour AOL de ne pas se baser sur l'IP pour gérer les sessions (http://webmaster.aol.fr/sessions.html).

    D'ailleurs il devrait être préconisé d'utiliser les cookies et les session-id dans l'url pour gérer les sessions. Et de ce fait, il faut proscrire la gestion d'une session via l'ip. c'est d'ailleurs ce que peut offrir les sessions php (via cookie notamment).

    Donc on est face à une anomalie dans le modèle OSI (je vous l'accorde, c'est pas le seul cas !). En effet, les sessions relèvent d'un niveau http (donc une couche supèrieure à 5 dans l'OSI) et se rendent dépendante du niveau IP c'est à dire du niveau 3, ce qui est une violation du modèle .

    L'utilisation de proxy est d'ailleusr parfaitement normalisé dans les normes HTML. Donc les sessions devraient tenir compte de ce comportement.

Discussions similaires

  1. [Cookies] sessions avec le navigateur AOL
    Par tenere3 dans le forum Langage
    Réponses: 4
    Dernier message: 09/06/2007, 08h46
  2. [Cookies] session php cookie
    Par afroweb dans le forum Langage
    Réponses: 5
    Dernier message: 16/05/2007, 10h55
  3. [Cookies] Problemes sessions php
    Par Gmal dans le forum Langage
    Réponses: 5
    Dernier message: 01/08/2006, 13h13
  4. [Cookies] Problème avec les sessions PHP !!!
    Par boukay dans le forum Langage
    Réponses: 4
    Dernier message: 14/02/2006, 17h32
  5. [Cookies] PB sessions php et navigation sous imode
    Par hardkmel dans le forum Langage
    Réponses: 8
    Dernier message: 23/12/2005, 12h22

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