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, 18h22   #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é] 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 :
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 ?
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 23h10   #2
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Je suis toujours pas mort, hehe !

Alors voilà, j'avais écrit ça en haut de la page :
Code :
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 ?
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 23h12   #3
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
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 :
1
2
3
session_start();
$_SESSION = array();
session_regenerate_id();
__________________
Rédacteur "éclectique" (XML, 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)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 23h19   #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
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 23h21   #5
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
en ce cas, remplace simplement par
__________________
Rédacteur "éclectique" (XML, 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)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 23h25   #6
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 23h33   #7
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
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, 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)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 23h43   #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
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 :
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 23h52   #9
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
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, 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)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 23h59   #10
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Merci pour ta réponse, Swoög.

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


Citation:
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é.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 00h09   #11
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
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 :
session_regenerate_id('delete_old_session')
or d'après la doc, je vois :
Citation:
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 :
session_regenerate_id(true);
__________________
Rédacteur "éclectique" (XML, 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)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 00h22   #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
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 :

Citation:
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 :
session_regenerate_id(vive_les_tomates).
C'est ça ? Rq, ça ne générait pas d'erreur, c'est étrange.

Citation:
ç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...
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 00h43   #13
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
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
Citation:
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, 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)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 00h49   #14
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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 ?

Citation:
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à.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 01h16   #15
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
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 :
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, 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)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 01h24   #16
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 09h11   #17
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
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
Kioob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 10h43   #18
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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é).
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 10h48   #19
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
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.
Kioob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 10h57   #20
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 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 ?
psychoBob 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 23h25.


 
 
 
 
Partenaires

Hébergement Web