Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/09/2007, 22h38   #1
Invité de passage
 
Inscription : août 2007
Messages : 20
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 20
Points : 2
Points : 2
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 :
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 :
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.
cozy_cookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 09h45   #2
Membre Expert
 
Inscription : octobre 2002
Messages : 1 141
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2002
Messages : 1 141
Points : 1 204
Points : 1 204
Envoyer un message via MSN à Raideman
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.
Raideman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 10h55   #3
Membre Expert
 
Inscription : octobre 2002
Messages : 1 141
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2002
Messages : 1 141
Points : 1 204
Points : 1 204
Envoyer un message via MSN à Raideman
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 :
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 :
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).
Raideman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2007, 16h43   #4
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
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 ?
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2007, 17h49   #5
Membre Expert
 
Inscription : octobre 2002
Messages : 1 141
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2002
Messages : 1 141
Points : 1 204
Points : 1 204
Envoyer un message via MSN à Raideman
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.
Raideman est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h20.


 
 
 
 
Partenaires

Hébergement Web