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é] Session_regenerate_id() déclenche l'erreur headers already sent.


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    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 : 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
     
    //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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?
    C'est pas parce que j'ai tort que vous avez raison.

  2. #2
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    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".
    Google is watching you !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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... ?
    C'est pas parce que j'ai tort que vous avez raison.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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...)
    C'est pas parce que j'ai tort que vous avez raison.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 46
    Points : 80
    Points
    80
    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

  6. #6
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    bien sûr que non !

    L'exemple de la doc me semble pourtant clair :
    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
     
     <?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);
    ?>
    Google is watching you !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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.
    C'est pas parce que j'ai tort que vous avez raison.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Citation Envoyé par Kioob
    bien sûr que non !

    L'exemple de la doc me semble pourtant clair :
    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
     
     <?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.
    C'est pas parce que j'ai tort que vous avez raison.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 )
    C'est pas parce que j'ai tort que vous avez raison.

  10. #10
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    Oui, c'est vraiment mieux contre le vol de session, mais à condition d'effacer l'ancien fichier de session !.
    Google is watching you !

  11. #11
    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
    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

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    session_start();
    session_unset();
    session_regenerate_id();

    Une autre idée ?

    (merci Mathieu pour le lien)
    C'est pas parce que j'ai tort que vous avez raison.

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

Discussions similaires

  1. [PHP 5.2] Besoin d'aide sur un formulaire : erreur headers already sent by
    Par Zargos dans le forum Langage
    Réponses: 1
    Dernier message: 21/05/2009, 21h56
  2. erreur : headers already sent
    Par chrisl0 dans le forum Langage
    Réponses: 5
    Dernier message: 01/04/2009, 22h25
  3. [MySQL] erreur header already sent (déja envoyé)
    Par youssef222 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/03/2009, 09h31
  4. erreur : headers already sent
    Par IsgTunis dans le forum Langage
    Réponses: 3
    Dernier message: 27/10/2007, 14h06
  5. [FPDF] Erreur: Headers already sent
    Par calitom dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 01/02/2007, 10h35

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