OVH Cloud OVH Cloud

Question(s) sur les sessions PHP

5 réponses
Avatar
VarioFlux
Bonjour,

ça fait un bout de temps que je regarde la doc sur les sessions, en me
disant qu'il faut que je me lance. Là j'ai un peu de temps et de
tranquillité, alors juste avant j'aimerais que vous m'aidiez à éclaircir
quelques points.

1) Grâce aux sessions, je n'aurais plus de problème de variables
inaccessibles dans certains scripts ?

2) Je lis partout qu'il faut faire appel à session_start() une fois au début
de chaque page, mais qu'en est-il d'une page faisant appel à une autre par
require ou include, qui éventuellement fait-elle même appel à une autre, etc
? Faut-il gérer ça, ou est-ce transparent ?

3) Pour effacer la session, il faut faire appel à session_destroy. Si un
utilisateur quitte la page avant, le fichier temporaire sera-il détruit
automatiquement, ou bien faut-il prévoir un petit ménage de temps en temps ?

4) J'ai un script récupéré qui utilise :
if (!$uniqid AND !headers_sent()) { $uniqid=uniqid(rand());
setcookie("uniqid",$uniqid,time()+(3600*24*365*30)); }
si j'ai bien compris, je doit pouvoir le modifier pour être en adéquation
avec les sessions de php 4.3.0. Quelqu'un peut-il m'aiguiller ?

Merci
--
VarioFlux
http://www.educador.biz
Centre d'éducation canine sur la Côte d'Azur

5 réponses

Avatar
\(¯`·...Rem's ...·´¯\)
Bjr,

1) Grâce aux sessions, je n'aurais plus de problème de variables
inaccessibles dans certains scripts ?


Exact..


2) Je lis partout qu'il faut faire appel à session_start() une fois au
début

de chaque page, mais qu'en est-il d'une page faisant appel à une autre par
require ou include, qui éventuellement fait-elle même appel à une autre,
etc

? Faut-il gérer ça, ou est-ce transparent ?


Il suffit de faire un include en entete de la page qui va inclure toutes les
autres

3) Pour effacer la session, il faut faire appel à session_destroy. Si un
utilisateur quitte la page avant, le fichier temporaire sera-il détruit
automatiquement, ou bien faut-il prévoir un petit ménage de temps en temps
?


Le fichier sera détruit une fois dépassé la durée de vie de la session ,
fixée dans le php.ini à la ligne : session.lifetime et
session.gc_maxlifetime

4) J'ai un script récupéré qui utilise :
if (!$uniqid AND !headers_sent()) { $uniqid=uniqid(rand());
setcookie("uniqid",$uniqid,time()+(3600*24*365*30)); }
si j'ai bien compris, je doit pouvoir le modifier pour être en adéquation
avec les sessions de php 4.3.0. Quelqu'un peut-il m'aiguiller ?


Là, je suis désolé mais j'ai pas le temps et en plus je n'utilise JAMAIS les
cookies (trop dépendants du client)..

Merci


De rien.
Salut.

Avatar
VarioFlux
Avatar
Nudrema
Guillaume Bouchard wrote:
Faire passé des id de session par get pose enormement de probleme de
securité, ne facilite pas le code ( flemard que je suis :)) et de plus
n'est pas joli dans l'url.


ce n'est pas exact : si tu utilises les sessions, c'est le serveur qui
décide quelle méthode de transmission du SessID utiliser (si compilé
avec --trans-sid dans linux, toujours je suppose dans windows)
en gros ça donne :
- si le client accèpte les cookies alors un cookie PHPSESSID est créé
- si le client ne les accepte pas le fichier envoyé est édité a
posteriori par le serveur pour y ajouter le fameux "?PHPSESSID=xxxxx".

d'autre part il faut toujours tester la validité de la session pour
chaque page (basé sur une reconnaissance de REMOTE_ADDR par exemple)
pour éviter les problèmes de "bookmarkage" d'url avec id sessions.

Avatar
Nudrema
- si le client ne les accepte pas le fichier envoyé est édité a
posteriori par le serveur pour y ajouter le fameux "?PHPSESSID=xxxxx".


Oui, mais il faut savoir que comme le serveur n'a aucun moyen de savoir
si le client accepte les cookie, il fera toujours un id par get au depart.


en fait après test il semblerait que effectivement le serveur utilise
toujours le système indiqué dans la configuration (donc si pas de
cookies et indiqué comme tel dans la config ça foire). Mais en tout cas
il ne faut pas pour autant ajouter <?php echo($PHPSESSID); ?> à chaque
lien...

d'autre part il faut toujours tester la validité de la session pour
chaque page (basé sur une reconnaissance de REMOTE_ADDR par exemple)
pour éviter les problèmes de "bookmarkage" d'url avec id sessions.


Je ne voie pas en quoi cela peut aider ? Plus de precision stp.


voir plus bas ;-)

Par contre, les problemes de l'id par get

- Bookmarkage d'une url inutile
- Copie sur un forum ou un NG d'une url contenant l'id de session ( j'ai
deja vu le faire, donc ce n'est pas un cas improbable )


ces cas peuvent être corrigés par la vérification de l'adresse ip du
visiteur (on refuse de récupérer la session (on la détruit) si l'ip
n'est pas bonne...) et/ou par l'ajout d'une variable 'expiration' à la
session (pour les bookmark dans le cas de connexions permanentes par
exemple)

De plus, php genere mal les id de session, car il met un & aulieu de
&amp; dans les chaines get ( reglable dans le php.ini quand on y a
acces... ) Et pour les formulaire, il foire tout, vu qu'il colle a la
balise <form> un inpyt hidden... Mais dans les recomandations, il ne
doit pas y avoir de input directement dans form, mais dans un block
avant. Bye Bye le validator.
pour les formulaires je n'avais jamais fait attention mais pour le &

plutôt que &amp; dis-moi si je me trompe mais tu peux corriger ça via
.htaccess non ? (de même tu peux spécifier via .htaccess que tu veux
utiliser les cookies ^^)

- Esseye de passer sur un vieux php PHPSSESID=<script
type="text/javascript">Alert('truc')</script> ( correctement encoder )
si je ne me trompe pas y avais un bug la dessus a une epoque, ce n'est
pas dangereux, mais tres moche :)


pas compris ^^ puis de toute façon je n'utilise que les dernières
versions ;-)


Avatar
Guillaume Bouchard
Nudrema wrote:

en fait après test il semblerait que effectivement le serveur utilise
toujours le système indiqué dans la configuration (donc si pas de
cookies et indiqué comme tel dans la config ça foire). Mais en tout cas
il ne faut pas pour autant ajouter <?php echo($PHPSESSID); ?> à chaque
lien...


En fait.
SI tu met use_trans_sid a ON, tu n'a pas besion d'ajouté un echo du
PHPSSESID.

Si tu le met a OFF ( reccomandé ) tu doit le faire manuelement.

Ensuite, comme je le disait, le serveur utilisera TOUJOURS ( sauf si tu
lui dit que tu ne veut pas de GET ) le GET à la premiere visite. A la
limite, si tu ne veut pas une chaine GET degeu au depart, tu peut faire
une suite de deux Header Location pour tester si les cookies fonctionent
et faire passé l'id de façon invisible pour la premiere foix, c'est
aussi crade que un id de session en GET :)


ces cas peuvent être corrigés par la vérification de l'adresse ip du
visiteur (on refuse de récupérer la session (on la détruit) si l'ip
n'est pas bonne...) et/ou par l'ajout d'une variable 'expiration' à la
session (pour les bookmark dans le cas de connexions permanentes par
exemple)


Expiration : inutile, les sessions expirent d'elle meme :)
Pour l'ip, cela securise, mais pas completement, il y a toujours le
probleme des personnes qui on le meme ip à cause de proxy, et souvent
ces personnes traine ensemble, donc peuvent se refiler facilement leur
ip... Bref, j'appele cela une bidouille :)

pour les formulaires je n'avais jamais fait attention mais pour le &
plutôt que &amp; dis-moi si je me trompe mais tu peux corriger ça via
.htaccess non ? (de même tu peux spécifier via .htaccess que tu veux
utiliser les cookies ^^)


Tu à raison.

--
Guillaume.