[PHP5]CLASSE DE SESSION

amezghal Messages postés 385 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 21 août 2015 - 17 juin 2007 à 12:27
emmanuel_php Messages postés 1 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 20 septembre 2012 - 20 sept. 2012 à 11:37
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43149-php5-classe-de-session

emmanuel_php Messages postés 1 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 20 septembre 2012
20 sept. 2012 à 11:37
Bonjour à vous,
juste pour information:
Applications web : sécuriser la session utilisateur =>
cyberzoide.developpez.com/securite/session ça date de 2006 mais c'est toujours bon à prendre.
Bonne journée à vous.
cs_chacharito Messages postés 1 Date d'inscription mardi 28 décembre 2010 Statut Membre Dernière intervention 12 janvier 2011
12 janv. 2011 à 11:48
s 'il vous plait je veux une session qui permet de gérer une bande livraison ajouter une quantité et un cin et un on appuie sur une bouton puis on reçois un message de confirmation
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
25 juin 2007 à 20:52
J'utilise PHP 5.1.6, ma source actuellement est posté ici, pour pouvoir utiliser des tableaux à plusieurs dimensions, j'ai étendu ma classe par RecursiveArrayIterator, et me suis contenté de tester comme cela :
$session = new Session();
$session['test'] = array('un', 'deux', 'trois');
$session['test'][] = 'quatre';
print_r($session['test']);
Ce qui me provoque une erreure...
Il faut donc manipuler les classes et rajouter certaines méthodes, mais c'est plutôt flou tout ça :p
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
25 juin 2007 à 18:20
Il faudrait que je vois ton code et la manière dont tu l'as implémenté, dans ce cas, pour t'aider.
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
25 juin 2007 à 16:37
Oui, je suis d'accord mais comment faire le lien entre ça et ma source ?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
25 juin 2007 à 15:13
Ca chez moi, ça marche :

<?php
$a = new RecursiveArrayIterator();
$a['test']['bla'] = 2;
echo $a['test']['bla'], '
';
echo gettype ($a['test']), '
';
echo gettype ($a), '
';
$a['tab'] = array (1,2,3);
$a['tab'][] = 4;
print_r ($a['tab']);
?>

Quelle version de PHP5 as-tu ?
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
25 juin 2007 à 14:33
J'ai étendu ma classe Session avec RecursiveArrayIterator, et ça ne marche pas !

$session = new Session();
$session['test'] = array('un', 'deux', 'trois');
$session['test'][] = 'quatre';
print_r($session['test']);

retourne toujours : Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in /Users/quentinberlemont/Sites/session.php on line 83
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
25 juin 2007 à 12:42
donc faudrait juste que la classe Session extends RecursiveArrayIterator ?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
25 juin 2007 à 12:22
Bon allez, en réalité c'est très simple car tout est déjà fait :

<?php
$a = new RecursiveArrayIterator();
$a['test']['bla'] = 2;
echo $a['test']['bla'], '
';
echo gettype ($a['test']);
?>
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
22 juin 2007 à 16:59
Mouais, j'ai pas tellement réussis :/
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
21 juin 2007 à 09:00
Ah vi en effet :p
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
19 juin 2007 à 12:26
Oui, c'est ce que je voulais dire :-)
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
19 juin 2007 à 10:02
Tu voulais dire RecursiveIterator ? Avec un "A", je ne trouve rien...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
19 juin 2007 à 09:32
Hello,

sauf que, Fhx, ça ne marche pas ton code.
$session->mon_autre_tableau[10] est pris pour une variable, pas un tableau, via les setter. Fais un print_r dessus.

Il faut implémenter arrayAccess avec d'autres interfaces/classes, dont recursiveAIterator.
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
19 juin 2007 à 08:36
Et si tu utilises l'implantation d'ArrayAccess, tu fais le même pour assigner une nouvelle valeur tu créer un nouveau tableau avec tes anciennes valeurs et tes nouvelles. C'est un peu moche :p mais ça fonctionne...

À par ça, niveau sécurité (session fixation et hijacking), est-ce bien mis en place avec les attributs (static) et la manière dont fonctionne la méthode check() ? Actuellement, uniquement Kankrelune et Coucou747 ont donné leur avis sur le sujet.

Tchô !
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
18 juin 2007 à 13:54
class session {

public function __get($var) {
return $_SESSION[$var];
}
public function __set($var, $val) {
$_SESSION[$var] = $val;
}

}

$session = new session;
$session->montableau[10][20][30] = array('x');
$session->mon_autre_tableau[10] = $session->montableau[10][20][30];
echo $session->mon_autre_tableau[10];

Où est le problème ?
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
18 juin 2007 à 13:48
Source mis à jour par rapport aux améliorations suggérés.

Malalam, j'ai peut être dis une connerie :D

l'interface ArrayAcces ne permet pas de faire ce que tu dis, de même que la version précédente de ma classe de session.

exemple :

$session = new Session();
$session['test'] = array();
$session['test']['bidule'] = 'truc';
$session['test']['bidule']['machin'] = 'chouette';

print_r($session);

résultat :

Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in X on line X

Ou peut être, j'utilise mal l'interface o_O ?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 juin 2007 à 12:58
Ok pour
$session->test=array('test' => array('test' => array('test' => array('test'))));
Et si ENSUITE, plus tard, je veux ajouter encore un élément $ $_SESSION['test']['test'] par exemple ? En gardant les précédents ?
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
18 juin 2007 à 10:01
Tu entend par là, d'enregistrer dans la session un tableau à plusieurs dimensions ?

$session = new Session();
$session->test=array('test' => array('test' => array('test' => array('test'))));
print_r($session->test);

non ?

Je pensais que ArrayAccess ne supportait pas les tableaux multidimensionnelles après avoir lu quelques articles sur cette interface (exemple : http://blog.plumbr.com/3-implement-arrayaccess-vous-connaissez ). En réalité le problème a été fixé et il gère effectivement les tableaux, c'est donc un moyen assez performant en effet pour réécrire une classe de session :)

Ensuite, au niveau du fingerprint ? Comment aurais tu fais toi, Malalam ?
Naixn Messages postés 455 Date d'inscription mardi 17 septembre 2002 Statut Membre Dernière intervention 22 juillet 2007
18 juin 2007 à 09:50
Malalam > $session = new Session; $session->bla = array(1, 2); ? Non ?
Ou alors j'ai mal compris ta question...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 juin 2007 à 09:28
Hello,

je trouve aussi que ta classe est légère. Une remarque tout bête : je fais comment, avec ta classe, une variable de session sous forme de tableau multidimensionnel ?
Je ne fais pas.
Clairement, de nos jours, pour réécrire une classe de session, il FAUT passer par la SPL et notamment arrayAccess.
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
17 juin 2007 à 22:07
Pourquoi ne pas vouloir utiliser $_SESSION ? Cette superglobale est faite pour ça, tout comme$_GET, $_POST, $_COOKIE, $_REQUEST, $_SERVER...

Ta classe ajoute une surcouche aux sessions qui n'est pas spécialement utile. Il vaut mieux utiliser directement les sessions. Leur mécanisme est si simple et efficace à mettre en oeuvre.
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
17 juin 2007 à 20:05
En faite, c'est après avoir lu cette article : http://phpsec.org/projects/guide/4.html que je me suis mis à ajouter le "fingerprint" dans ma class de session. Car rappelons-le, cette class n'a pas pour but d'enregistrer nos sessions dans une base de donnée ou tout autre mode d'enregistrement de donnée (texte, etc..) mais d'eviter de se servir directement dans nos scripts de la variable super global "$_SESSION" et ainsi, si par la suite, nous voulons coder différement, il suffira de modifier qu'un fichier...
Ensuite, le fingerprint est venu se greffer afin d'ajouter un plus en matière de sécurité !

> Krankrelune, il sert à rien de la façon que je l'enregistre et le compare, ou sert à rien tout court ?

> Coucou747, j'ai pas tout compris, pourrais-tu reformuler ta question s'il te plait ?

A+ ! ;)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 juin 2007 à 19:00
le vol de sessions, c'est pas une faille courante... comment tu peux avoir le md5 de microtime du moment ou le gars que tu veux voler s'est connecte ?
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
17 juin 2007 à 18:30
ah bon ? et pourquoi cela ?
Si la variable enregistré dans la classe n'est pas égale à celle enregistré dans les sessions, cela signifie que la session a été détourné... donc une exception est levée et bloque l'accés. Je ne vois pas pourquoi ça ne "sert strictement à rien". Pourrais-tu plus développer afin que je comprenne mieux ton point de vue ?
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
17 juin 2007 à 12:45
Salut...

Tout d'abord ton "fingerprint" ne sert strictement à rien là... sinon...

http://fr2.php.net/manual/fr/function.session-set-save-handler.php

@ tchaOo°
amezghal Messages postés 385 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 21 août 2015 5
17 juin 2007 à 12:27
salut
-pour les tests de ce genre: if(isset($this->fingerprint) == false
il suffit d'utiliser:if(!isset($this->fingerprint))
-idem pour:if($x==true) il suffit:if($x)
-pour la géneration des nombres aléatoire utilise plutot la fonction mt_rand()( qui initialise le générateur automatiquement des php 4.2.0)