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 11/05/2006, 10h08   #1
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Par défaut [Sécurité] Session_regenerate_id() déclenche l'erreur headers already sent.

Bonjour,

J'utilise les sessions et pour ce faire j'effectue bien sur un session_start() en haut de chaque page. Cela fonctionne bien.
On me dit que pour la sécurité mieux vaut utiliser session_regenerate_id().
J'ai donc un fichier, nommé liens-inscriptions, qui s'inclue dans toutes les pages et dont voici le 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
 
//si le session n'est pas ouverte (visiteur non identifié)
if(!isset($_SESSION[id]))
{echo'
Bienvenue invité ( <a href="identification.php">Connexion</a> | 
<a href="inscription-condition.php">Inscription</a> )';}
//si la session est ouverte
else
{
echo"
Bienvenue $_SESSION[pseudo] (
 <a href=\"compte-accueil.php\">Tableau de bord</a> |  
<a href=\"A href="http://www.site.com/deconnexion.php\">
d&eacute;connexion</a>
 )"
;
//ici on compare le temps actuel avec le temps lors de l'identification
//si il y a 30 minutes sans réactualisation de page, on va tout fermer
if(time()-$_SESSION['dernier_acces']>1800) 
{
  session_destroy(); 
  session_unset();
}
//si le délais n'est pas dépassé, on réinitialise la variable de session au temps actuel.
else
{
$_SESSION['dernier_acces'] = time();
session_regenerate_id();
}
;}
là vous pouvez voir le session_regenerate_id() coupable, qui déclenche l'erreur suivante:
Code :
1
2
3
4
5
6
 
 Warning: session_regenerate_id(): 
Cannot send session cookie - 
headers already sent by 
(output started at /home/site/www/index.php:8 in
 /home/site/scripts/liens-inscription.php on line 26
D'où vient l'erreur à votre avis ?
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h27   #2
Membre chevronné
 
Avatar de Kioob
 
Olivier Bonvalet
Inscription : septembre 2004
Messages : 550
Détails du profil
Informations personnelles :
Nom : Olivier Bonvalet
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : septembre 2004
Messages : 550
Points : 723
Points : 723
Envoyer un message via MSN à Kioob
euh... là faudrait essayer de ne pas se foutre de la g***le des gens...

session_regenerate_id(), tout comme session_start() envoie un cookie... donc forcément c'est à placer _avant_ tout envoi. En plus il y a même un exemple d'utilisation dans la doc...

Et Google regorge de réponses pour ce "problème". Toutes les fonctions envoyant un entête HTTP doivent être appelées avant d'envoyer le code "html".
Kioob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h28   #3
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Bon alors j'ai essayé de placer le session_regenerate_id() juste en dessous du session_start(), en haut de l'index qui inclut les autres fichiers.

Cette fois j'obtiens l'erreur :

Code :
1
2
3
4
 
Warning</b>:  session_destroy(): Session object
 destruction failed in 
home/site/scripts/liens-inscription.php
Poétique n'est-il point ? Mais encore... ?
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h30   #4
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Citation:
Envoyé par Kioob
euh... là faudrait essayer de ne pas se foutre de la g***le des gens...

session_regenerate_id(), tout comme session_start() envoie un cookie... donc forcément c'est à placer _avant_ tout envoi. En plus il y a même un exemple d'utilisation dans la doc...

Et Google regorge de réponses pour ce "problème". Toutes les fonctions envoyant un entête HTTP doivent être appelées avant d'envoyer le code "html".


Donc c'est à utiliser en lieu et place des session_start() ?

(Ils sont pas fameux les exemple d'utilisation dans la doc...)
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h31   #5
Membre du Club
 
Inscription : mars 2006
Messages : 45
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : mars 2006
Messages : 45
Points : 50
Points : 50
Par défaut session_regenerate_id

en comptant les lignes (si tu as envoyé le contenu de ton fichier source), ton erreur survient une ligne au dessus de la commande session_regenerate_id().

Peux tu confirmer ?

Si je me trompe, quelle version de php utilises-tu ?

Je crois que tu auras une réponse ici :
http://ilia.ws/archives/47-session_r...provement.html
cyrianox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h32   #6
Membre chevronné
 
Avatar de Kioob
 
Olivier Bonvalet
Inscription : septembre 2004
Messages : 550
Détails du profil
Informations personnelles :
Nom : Olivier Bonvalet
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : septembre 2004
Messages : 550
Points : 723
Points : 723
Envoyer un message via MSN à Kioob
bien sûr que non !

L'exemple de la doc me semble pourtant clair :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 <?php
session_start();
 
$old_sessionid = session_id();
 
session_regenerate_id();
 
$new_sessionid = session_id();
 
echo "Ancienne session: $old_sessionid<br />";
echo "Nouvelle session: $new_sessionid<br />";
 
print_r($_SESSION);
?>
Kioob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h33   #7
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Citation:
Envoyé par cyrianox
en comptant les lignes (si tu as envoyé le contenu de ton fichier source), ton erreur survient une ligne au dessus de la commande session_regenerate_id().

Peux tu confirmer ?

Si je me trompe, quelle version de php utilises-tu ?

Je crois que tu auras une réponse ici :
http://ilia.ws/archives/47-session_r...provement.html
L'erreur se déclenche pile à la ligne du sessions_regenerate_id(), dans mon script.
Je ne sais pas la version, mais je suis chez ovh, à priori ils sont à jour.

Je vais voir le lien, merci.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h35   #8
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Citation:
Envoyé par Kioob
bien sûr que non !

L'exemple de la doc me semble pourtant clair :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 <?php
session_start();
 
$old_sessionid = session_id();
 
session_regenerate_id();
 
$new_sessionid = session_id();
 
echo "Ancienne session: $old_sessionid<br />";
echo "Nouvelle session: $new_sessionid<br />";
 
print_r($_SESSION);
?>
C'est parce que j'ai jamais travaillé avec les sessions, ça me parle pas les session_id() , session_start_on_the_machine(), session_kill_them_all()... etc!

Bon je vois ce qu'il fallait voir, je vais tester ce bout de code, merci Kioob.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h49   #9
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Ok, merci les gars

Le print-r($_SESSION) sert à afficher toutes les variables de la session c'est ça ? (poruquoi pas un echo"$_SESSION" au fait, histoire de revoir les bases)

Donc j'ai fait cela au final :
Code :
1
2
3
 
session_start();
session_regenerate_id();
Je ne peux plus vérifier car j'ai enlever les echos. Vous confirmez que c'est bon ?
Et c'est vraiment mieux contre le vol de session ? (c'est ce qui se dit, mais j'ai pas tout compris )
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h53   #10
Membre chevronné
 
Avatar de Kioob
 
Olivier Bonvalet
Inscription : septembre 2004
Messages : 550
Détails du profil
Informations personnelles :
Nom : Olivier Bonvalet
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : septembre 2004
Messages : 550
Points : 723
Points : 723
Envoyer un message via MSN à Kioob
Oui, c'est vraiment mieux contre le vol de session, mais à condition d'effacer l'ancien fichier de session !.
Kioob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 10h55   #11
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
tu trouveras plus d'explications sur l'erreur que tu as eu dans la FAQ PHP
http://php.developpez.com/faq/?page=...s_already_sent
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 11h16   #12
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Citation:
Envoyé par Kioob
Oui, c'est vraiment mieux contre le vol de session, mais à condition d'effacer l'ancien fichier de session !.
Bon alors je me faire frapper, mais comme je ne sais pas comment effacer l'ancier fichier de session, j'ai fait cela :

Code :
1
2
3
4
 
session_start();
session_unset();
session_regenerate_id();

Une autre idée ?

(merci Mathieu pour le lien)
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h19.


 
 
 
 
Partenaires

Hébergement Web