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 28/05/2007, 16h11   #1
Nouveau Membre du Club
 
Inscription : octobre 2006
Messages : 107
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 107
Points : 26
Points : 26
Par défaut [Sécurité] Problème session_regenerate_id()

Bonjour à tous!
Ayant découvert les sessions récemment, je me sert de celle-ci pour un site en php.
Je me suis servi de ce tuto : http://a-pellegrini.developpez.com/t...?page=sommaire

J'ai donc créé une bd nommé "site" avec 2 tables :
->utilisateur qui contient l'id de l'utilisateur, son login et son mot de passe
->session qui contient l'id de session (sid), ainsi que userid (variable associant la session a l'id de l'utilisateur).

Voici mon script:
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
 
//Fonction pour se connecter a la base de données
function getDatabaseConn(){
  $database = '';
  $user = '';
  $password = '';
  //Connection au serveur
  $database_conn = mysql_connect($database, $user, $password) or die ("impossible de se connecter au serveur");
 
  //Selection de la base de donnée
  mysql_select_db('site') or die ("impossible de se connecter a la base de donnees");
}
 
//Fonction qui regenère un identifiant de session et le sauvegarde dans la db
function openSession($userid) {
  //Requete pour supprimer la session en cours
  $query=sprintf("DELETE FROM session
  WHERE userid = '%s'",
  mysql_real_escape_string($userid));
  //Envoie de la requete
  $reponse = mysql_query($query);
 
  // Re-génération du sid
  session_regenerate_id();
 
  // On insère le nouvel id de session dans la db
  $insertSQL=sprintf("INSERT INTO session (sid, userid)
  VALUES ('%s', '%s');",session_id(),$userid);
  //Envoie de la requete
  $reponse = mysql_query($insertSQL);
  return TRUE;
}
//Fonction pour récupérer les info de l'utilisateur
function getUserInfo() {
  //Requete SQL a envoyer
  $query=sprintf("SELECT utilisateur.id, utilisateur.login, utilisateur.password
  FROM session INNER JOIN utilisateur
  ON session.sid = '%s'
  AND session.userid = utilisateur.id",mysql_real_escape_string(session_id()));
 
  //Envoie de la requete
  $result = mysql_query($query);
 
  // Extraction dans un tableau du résultat de la requete
  while ($userdata = mysql_fetch_assoc($result)) {
    echo $userdata['id'];
    echo $userdata['login'];
    echo $userdata['password'];
  }
  if (empty($userdata)) {
    $userdata = FALSE;
  }
 
  return $userdata;
}
getDatabaseConn();
$LoginCheck = getLoginCheck($_POST['login'],$_POST['password']);
if($LoginCheck==FALSE){
  echo "Login ou mot de passe incorrecte";
}
else{
  session_start();
  echo "Valeur retourné par session_id() = ".session_id();
  openSession($LoginCheck);
  $userdata = getUserinfo();
  echo "Valeur retourné par getUserinfo()<br/>";
  echo "Id = ".$userdata['id']."<br/>";
  echo "Login = ".$userdata['login']."<br/>";
  echo "PassWord = ".$userdata['password']."<br/>";
}
J'ai une erreur lorsque que j'utilise session_regenerate_id() dans la fonction openSession() :
Citation:
Warning: session_regenerate_id() [function.session-regenerate-id]: Cannot regenerate session id - headers already sent in C:\wamp\www\test.php on line 70
Mes requêtes fonctionnent et je ne sais pas trop d'où vient le problème!
Est-ce que c'est parce que j'utilise la méthode POST pour le login et le mot de passe?
Si quelqu'un a une idée!
Merci d'avance.
David
goddet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 16h15   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
L'erreur vient du fait que tu utilises session-regenerate-id() alors que tu as déjà affiché quelquechose dans ta page (par des echo, du html, un saut de ligne etc.).
Tu ne peux pas faire appel aux fonctions de sessions après avoir déjà envoyé les entêtes au navigateur.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 10h17   #3
Nouveau Membre du Club
 
Inscription : octobre 2006
Messages : 107
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 107
Points : 26
Points : 26
Merci pour ta réponse. J'ai testé sans rien afficher sur ma page avant le session_regenerate_id() et je n'ai plus le warning!
Cependant j'utilise des feuilles de style css et je dois quand même afficher des choses (une banièrre et une image en bas de page).
Y-a-t-il une alternative?
goddet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 11h18   #4
Membre régulier
 
Avatar de NiHiL
 
Inscription : juin 2006
Messages : 102
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 102
Points : 88
Points : 88
Oui, tu sépares le traitement des données de la génération du HTML.
NiHiL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 13h46   #5
Nouveau Membre du Club
 
Inscription : octobre 2006
Messages : 107
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 107
Points : 26
Points : 26
Au risque de passer pour un boulet, je ne vois pas trop comment séparer le traitement des données de l'affichage HTML!!
Imaginons que je dois afficher un formulaire avec login et mot de passe et regenerer l'id de session une fois que l'utilisateur est loggerpar mesure de sécurité!
Je devrais forcement afficher d'abord le formulaire a l'ecran puis appeler session_regenerate_id().
Si quelqu'un peut m'expliquer je ne suis pas contre...
Merci
goddet 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 19h47.


 
 
 
 
Partenaires

Hébergement Web