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é] Déconnexion : Warning session_destroy() Session object destruction failed


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é] Déconnexion : Warning session_destroy() Session object destruction failed
    Bonjour,

    Je viens laborieusement de "terminer" un script anti vol de session, recommandé par Wanania, sur quelques obscures posts précédemment ouvert.

    Mais maintenant si on vol la session (je passe les détails) et que le script veut se déconnecter, j'obtiens l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Warning session_destroy() Session object destruction failed
    La ligne indiquée pour l'erreur est celle de l'instruction session_destroy(); dans l'instruction qui compare deux numéros et qui détruit la session si ils ne sont pas identiques.


    Quelqu'un peut m'en dire plus ?
    C'est pas parce que j'ai tort que vous avez raison.

  2. #2
    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
    Je suis toujours pas mort, hehe !

    Alors voilà, j'avais écrit ça en haut de la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    session_start();
    session_regenerate_id(delete_old_session);
    ?>
    j'ai enlevé la deuxième ligne pour ne conserver que le session_start().
    Maintenant je n'ai plus le message d'erreur.

    Mais je veux quand même conserver le session_regenerate_id.
    Je fais comment s'il vous plait ?
    C'est pas parce que j'ai tort que vous avez raison.

  3. #3
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    si tu fais un session_destroy, la session est forcément détruite... ça ne sert pas à grand chose de faire un regenerate_id avant...

    par contre, ce que tu pourrais faire, qui aurait le même effet, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    session_start();
    $_SESSION = array();
    session_regenerate_id();
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  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
    Oui mais je n'ai pas été clair.
    Je fais le session_regenerate_id() en haut de l'index.
    Il est donc effectif sur toutes les pages ou presque, puisqu'elles sont inclues dans index.php.

    C'est donc dans l'index qu'est inclu le script qui selon les cas induits une déconnexion.
    Et là justement, le cas échéant ça foire.

    Sur les pages avec seulement session_start(), le session_destroy() ne génère aucune erreur.


    Donc en fait le session_regenerate doit être actif tant qu'il n'y a pas de session_destroy(), puisque les cas de déconnexions surviennent exceptionnellement si la session est volée.
    C'est pas parce que j'ai tort que vous avez raison.

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    en ce cas, remplace simplement par
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    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
    Bien vu

    Es-tu certain que $_SESSION = array() garanti la même destruction de session que session_destroy ?
    Je pensais que cela s'utilisait plutot à la place de session_unset et en complément de session_destroy.
    C'est pas parce que j'ai tort que vous avez raison.

  7. #7
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    en effet, ça remplace littéralement session_unset (qui est dépréciée) cependant, session_destroy ne fait pas grand chose de plus...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  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
    Et n'y aurait-il point un mystère fatal pour la sécurité dans ce "quelque chose de plus..." ?


    Autre question pendant que nous y sommes :
    J'ai laborieusement réussi à trouver cette ligne, censée régénérer les numéros de sessions et effacer les anciens fichiers de sessions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session_regenerate_id(delete_old_session);
    Outre que je ne sais toujours pas ce que l'on nomme un "fichier de session", je voudrais bien avoir la confirmation que cette ligne fait bien son travail et accessoirement avoir le détail de son action sur les efforts de l'éventuel voleur de session.

    Merci pour vos explications.
    C'est pas parce que j'ai tort que vous avez raison.

  9. #9
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    delete_old_session doit être un booléen (cf la doc), càd true ou false, là c'est une constante que tu as indiquée

    les fichiers de sessions ce sont les fichiers dans lequels les variables de sessions sauvegardées

    cette fonction est à double tranchant :
    ça change le sid sur chaque page où tu iras...
    ce qui signifie que à chaque fois que ton visiteur cliquera sur un lien, son sid changera mais si il donne un lien avec son sid et que quelqu'un charge le lien avant lui, alors la session sera volée, et le sid changé, sans possibilité de ratrapper la session... cependant, si le visiteur légitime clique sur un lien du site avant que le lien qu'il a donné ne soit chargé alors le sid qui est dans le lien deviendra invalide...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  10. #10
    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
    Merci pour ta réponse, Swoög.

    Je dois reconnaitre que je n'ai rien compris à ce que tu dis là:


    delete_old_session doit être un
    booléen (cf la doc), càd true ou false,
    là c'est une constante que tu as indiquée
    Je m'échine depuis ce matin, entre autres choses, à trouver comment effacer les fichiers de sessions en plus de les régénérer, je pense enfin avoir trouver et maintenant c'est encore faux.

    Mais alors qu'elle est la bonne solution ?

    Je ne vois pas en quoi j'ai indiqué une constante pour delete_old_session, elle n'a pas de paramètre, elle est passée en paramètre à session_regenerate_id (si je ne me trompe pas dans le vocabulaire).

    Pour le reste de ton explication, à propos des sid, là j'ai pigé.
    C'est pas parce que j'ai tort que vous avez raison.

  11. #11
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    le sid c'est le numéro de session, l'identifiant de session tu comprends mieux ce que j'ai mis ?

    en PHP, quand tu précise une chaîne qui n'est pas entre quotes comme là, c'est une constante, qui doit être définie avec define, si elle n'est pas définie, PHP considère que c'est la chaîne de caractère...

    donc dans ce cas, c'est comme si tu faisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session_regenerate_id('delete_old_session')
    or d'après la doc, je vois :
    bool session_regenerate_id ( [bool delete_old_session] )
    ça veut dire que l'argument s'il est précisé doit être un bool, le delete_old_session, c'est uniquement le NOM de l'argument...

    donc pour faire ce que tu veux, ça serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session_regenerate_id(true);
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  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
    As-tu déjà été en haut d'une montagne abrupte, donnant une vue infinie sur des contrées inexplorées, Swoög ?
    Cela me fait la même sensation quand tu m'expliques tout ça.

    Bon je reprend :

    en PHP, quand tu précise une chaîne qui n'est pas entre quotes comme là, c'est une constante, qui doit être définie avec define, si elle n'est pas définie, PHP considère que c'est la chaîne de caractère...

    donc dans ce cas, c'est comme si tu faisais Code :
    session_regenerate_id('delete_old_session')
    Donc là j'avais écrit la même chose que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session_regenerate_id(vive_les_tomates).
    C'est ça ? Rq, ça ne générait pas d'erreur, c'est étrange.

    ça veut dire que l'argument s'il est précisé doit être un bool, le delete_old_session, c'est uniquement le NOM de l'argument...

    donc pour faire ce que tu veux, ça serait : Code :
    session_regenerate_id(true);
    Bon alors là j'ai surement des trucs à apprendre :
    L'argument doit être un bool. Mais un bool de gum ? hu hu...hum désolé.
    Faisons simple, avant que je n'épluche quelques tutoriels : qu'est ce qu'un bool et surtout en quoi delete_old_session est-elle un bool ?
    Et combien de bool était possible à la place de delete_old_session ? Et surtout, pourquoi le fait d'indiquer true signifierait-il que l'on a choisi le bool delete_old_session et non pas un autre ?
    Parce que je ne vois pas en quoi le true va m'effacer mes anciens fichiers de sessions, ici. Il dit juste que session_regenerate_id est true mais session_regenerate_id régénère l'id mais n'efface pas les anciens fichiers de sessions.


    Oui je sais...
    C'est pas parce que j'ai tort que vous avez raison.

  13. #13
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    oula...
    alors pour vive les tomates, oui, c'est exactement ça...

    pour les erreurs, c'est simplement parce que le niveau de report n'est pas assez haut, sinon tu aurais eu une notice te disant que la constante n'existait pas.


    un bool, c'est l'abréviation (classique en programation) de boolean, booléen en français, c'est un type de variable qui ne peut prendre que deux valeurs : vrai (true) ou faux (false), oui ou non, d'un point de vue numérique : 1 ou 0

    Excuse moi de te dire ça... mais vu les remarques que tu as fait, j'ai l'impression que tu n'as JAMAIS fait de programmation là c'est juste que t'es fatigué ou... ?

    dans la doc tu vois
    bool session_regenerate_id ( [bool delete_old_session] )
    ça veut dire que session_regenerate_id est une fonction qui renvoie un bool et prend (éventuellement parce qu'il est entre crochets) un bool en paramètre, le nom de ce paramètre, c'est delete_old_session

    mais le nom n'a rien à voir, c'est juste pour pas dire le premier paramètre, ou plutôt le paramètre puisque là y'en a qu'un...

    donc ce paramètre selon qu'il soit à true ou à false, il a un effet sur la fonction, s'il vaut true, la fonction efface les anciens fichiers de session, s'il vaut false elle ne le faux pas...

    ça va mieux là ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  14. #14
    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
    Ah oui là j'ai tout compris, merci !

    C'est le fait que le paramètre soit unique qui me permet de comprendre qu'il suffise d'indiquer true ou false. Je pensais qu'il y en avait plusieurs possibles, donc je bloquais...

    Tiens d'ailleurs, si il y en avait eu plusieurs de possibles, cela se serait présenté comment par exemple ?

    Excuse moi de te dire ça... mais vu les remarques que tu as fait, j'ai l'impression que tu n'as JAMAIS fait de programmation là c'est juste que t'es fatigué ou... ?
    Y'a pas de mal... En effet je n'ai jamais suivi de cours théoriques, si ce n'est un UV du CNAM, mais trop compliqué pour moi et mon emploi du temps.
    100% sur le tas, mais la pratique sans la théorie, ça va un peu mais ça trouve vite ses limites (la théorie sans la pratique, ça sert à que dalle par contre il me semble).

    **edit**
    Honnêtement j'ai vraiment épluché google pour le truc du session session_regenerate_id, mais je n'ai pas trouvé la solution, la preuve. Comme quoi même sur le net, y'a encore des tutos à écrire. A croire que ça se transmet par le bouche à oreille ces trucs là.
    C'est pas parce que j'ai tort que vous avez raison.

  15. #15
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par psychoBob
    Tiens d'ailleurs, si il y en avait eu plusieurs de possibles, cela se serait présenté comment par exemple ?
    C'est chaque langage qui gère ça à sa façon

    en PHP, c'est l'ordre des paramètres, la première valeur est pour le premier paramètre ainsi de suite, c'est pour ça que quand il y a des paramètres optionels il sont toujours à la fin de la liste

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function test($var1, $var2) { echo $var1.$var2; }
    test("aa", "bb");
    mis à part le fait que ça sert pas à grand chose, ça affichera aabb : $var1 vaudra "aa" et $var2 vaudra "bb"

    c'est mieux comme ça ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  16. #16
    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
    Ouip, merci Swoög.

    C'est des maths tout ça, faudra que je m'y remette un de ces jours... J'espère que je serais mort avant.


    Encore merci
    C'est pas parce que j'ai tort que vous avez raison.

  17. #17
    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
    Histoire de compliquer un peu les choses : ce fameux parametre "delete_old_session" n'est disponible que depuis PHP 5.1. C'est à dire qu'il y a de très grandes chances pour que tu n'ais pas cette option.

    Il faudrait donc faire "autrement", mais là ça se complique
    Google is watching you !

  18. #18
    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
    Je suis ovh, je pense qu'ils sont à jour, non ?

    Sans quoi, à défaut de faire un script, ça déclenche une erreur ou quoi ?
    A priori, soit c'est activé, soit ça déclenche pas d'erreur puisque j'ai fait un echo session_id() et bien l'id change à change page, comme prévu (savoir si ça efface l'ancien fichié, je l'ignore en tout cas pas d'erreur, mais c'est peut être justement parce que 5.01 est activé).
    C'est pas parce que j'ai tort que vous avez raison.

  19. #19
    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
    alors, en vrac :
    - PHP 5.1 est très peu répandu chez les hebergeurs... le mieux serait que tu vérifies ( fonction phpinfo(); )
    - comme déjà constaté dans divers sujets ton PHP n'est pas configuré pour afficher toutes les erreurs... donc forcément, tu en loupes beaucoup
    - les parametres en trop sont sûrement ignorés
    - utiliser session_regenerate_id() sans effacer l'ancienne session fait l'effet inverse : cela favorise le vol de session. En effet l'utilisateur peut alors se retrouver avec des dizaines de numéro de session valides, et donc autant de "chances" supplémentaire d'avoir un vol ou conflit de session.
    Google is watching you !

  20. #20
    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 je viens de vérifier dans phpInfo(), tout en haut il y a un jolie
    PHP Version 4.4.2

    Pourquoi ces imbéciles font de la pub avec leur php5 alors ?
    Dans les spécifications de leurs mutualisés, ils marquent :
    Langages de script
    PHP 4PHP 5Perl 5CPython


    Bon je fais comment alors maintenant ?
    Je laisse tomber session_regenerate_id, au risque de me faire pirater, ou bien je me lance dans un script pourri donc je ne perçoit même pas le moindre début de commencement de bout de code ?
    C'est pas parce que j'ai tort que vous avez raison.

Discussions similaires

  1. [MySQL] Connexion BD via Session ?
    Par Sylvain245 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/01/2011, 13h02
  2. Réponses: 0
    Dernier message: 08/11/2010, 17h37
  3. Réponses: 3
    Dernier message: 18/09/2009, 18h17
  4. Réponses: 1
    Dernier message: 19/08/2009, 14h27

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