Problème avec un système de sessions sécurisée (cookie et sql)

Eléphant du PHP | 189 Messages

18 avr. 2008, 14:30

Bonjour,

J'essaye de coder un site web avec un système de session (cookie et ou session) sécurisée.
J'ai épluché le code de phpbb, et "recopié" une partie de leurs système de vérification.

Expliqué brièvement cela donne :

- Un utilisateur se connecte en ayant cocher la case "Se souvenir de moi"
- Une entrée dans une table session est enregistrée contenant le SSID, l'id utilisateur, et la durée de vie de la session
- J'enregistre en même temps le SSID et l'id dans deux cookies.

Quand il vient sur le site, une requête me permet de vérifier si le SSID existe pour l'ID de l'utilisateur courant.

J'ai deux soucis avec ce système :

- La table va finir par se remplir imaginon un utilisateur efface ces cookies, il revient se log (Ca fonctionne vu que le champ ID n'est pas unique, ce qui permet a un utilisateur d'être connecté sur plusieurs postes) l'entrée dans la DB ne sera supprimée qu'une fois la durée de vie terminée..

Maintenant a combien faut-il fixer cette durée de vie ? 1 ans me parait énorme, ou y'a t-il une autre solution ?
(C'est pourtant la durée de vie du cookie que vient de me créer se forum ..)

- Le second soucis, se pose avec les sessions.. Le problèmes est ici encore plus présent, dois-je enregistrer une entrée dans la DB ? sachant qu'une session ne durera rarement plus de quelques heures ?

Ces questions me pose vraiment problème et la je n'ai pas vraiment pus voir de solution dans le code de Phpbb vu le nombre conséquent de ligne je m'y suis perdu..

Un grand merci a vous ;-)

Eléphant du PHP | 353 Messages

18 avr. 2008, 14:47

Hum...

Recopier le code de phpbb est un début.. mais peut etre pas la meilleur des solutions (c'est l'un des forums qui se hack le plus facilement).

Au niveau de la durée de vie du cookie, je le met en général à 1 mois. Ca reste raisonnable comme durée de vie.
Concernant la session, personnellement je l'enregistre afin de dresser des stats, de tracker les multicomptes et autre. Mais ce n'est pas une obligation.

Eléphant du PHP | 189 Messages

18 avr. 2008, 14:56

Hee quand j'ai dis "recopier" c'est surtout l'idée que j'ai utilisé tout le code vient de moi !!!

Mais justement l'idée que j'ai eu en regardant le code de phpbb (ou plutôt les changements dans la DB lors d'une connection) ne me permettent pas d'avoir une vue d'ensemble du fonctionnement sous Phpbb..

J'ai du mal a imaginer comment font-il pour ne pas avoir une DB qui grandit grandit grandit...

Je me souvient d'ailleurs que phpfrance a un moment eu des soucis vu le nombres de membres avec la table sessions..


Edit :

Arrêtez moi si je part sur une mauvaise piste :-p

Je devrais en fait faire deux systèmes 1 pour les cookies, 1 pour les session...
Si une session existe, je n'ai qu'a aller chercher les données dans la base de donnée (identifiant,id..)

Si un cookie existe étant donné que la session (le SID que j'ai enregistré dans le cookie) n'est plus d'actualité, je la compare a ce que j'ai dans ma base de donnée, si c'est cohérent je peux rapatrier les informations de utilisateur.

Mais ma question (le but de ce topic) est comment empêcher ma table session de garder des sessions qui ne serait plus valable, par exemple si l'utilisateur supprime ces cookies..

Le seul moyen logique serait de se baser sur la durée de vie du cookie ou de la session qui est contenue dans la DB, et supprimer tout les enregistrements plus vieux que la durée de vie du cookie..

Et si vous ne m'arrêtez pas jusqu'ici, que donc ma réflexion n'est pas tout a faite bête..
A combien pensez-vous qu'il faut fixer une durée de vie d'un cookie?

Comme a dit yaug (merci au passage :wink: ) 1 mois ? Alors comment phpbb s'en tire avec des cookies d'1 an ?

Merci a vous

Eléphant du PHP | 189 Messages

19 avr. 2008, 21:37

Personne ?

Allez, ne boudez pas mon topic, je suis certain que vous beaucoup de monde a déjà fait fasse a cette question :shock:

Mammouth du PHP | 19672 Messages

19 avr. 2008, 21:59

Salut, je ne connais pas la réponse exacte, mais ce que j'explorerais pour ma part, ce serait d'avoir d'affecter moi-même un nom à la session en fonction des données de l'utilisateur (nom, prénom, autre, etc...) qui me resservirait chaque fois que le membre se reconnecte. De cette manière, le nom de session étant calculé, je n'ai pas besoin de l'enregistrer, et la durée de vie du cookie est un peu sans importance.

Enfin bon, c'est une idée hein... :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 189 Messages

19 avr. 2008, 22:52

Merci beaucoup pour ta réponse...

Mais l'idée du sid c'est bien d'être unique non ?
Si je crée imaginons un id de session du style 13number (id,nick) le tout crypté en md5, les risques de hack sont plus grand non ?

Quelqu'un qui crée un cookie avec ces informations (je vais loin car il doit déjà le trouver, mais bon le md5 n'est pas non plus ce qui est le plus difficile a décoder) pourrait être logué sans jamais entrer de passe..
L'idée du cookie étant de reconnaitre quelqu'un étant déjà identifié.

Je n'ai vraiment aucune idée, et peut être je dis des bêtises mais au moins, je suis sur le bon forum pour ce genre de débat !!!

Mammouth du PHP | 19672 Messages

19 avr. 2008, 23:05

Le problème du hachage est qu'il est irréversible : or en récupérant une information dans un cookie, il faut pouvoir le relier très rapidement avec les données d'un utilisateur précis, ce qui signifie que tu ne peux pas reconstruire toutes les possibilités offertes par autant de membres qu'en compte ton forum. Il faut donc un système réversible. Et comme tu le soulignes, le SID est unique, mais rien ne t'empêche de créer toi aussi des identifiant uniques en combinant divers éléments, mais si tu utilises le SID automatique, il te faudrait alors l'enregistrer en base en le reliant à un utilisateur précis pour le retrouver rapidement...

Quoiqu'il en soit, je ne suis pas certain qu'au niveau sécurité ce soit un bon système : dans la mesure où un cookie permet de le logguer automatiquement, si quelqu'un utilise ta machine à ton insu, il n'aura rien à faire pour se connecter à ta place et éventuellement se servir de ton compte, modifier ton profil, changer ton mot de passe... et disparaitre : il te restera alors à batailler pour récupérer ton identité sur le site. Pour parer à ce problème, il faudrait que lors d'une reconnexion via cookie, l'accès à certaines partie imposent l'identification effective par login/mot de passe.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 189 Messages

19 avr. 2008, 23:19

Pour parer à ce problème, il faudrait que lors d'une reconnexion via cookie, l'accès à certaines partie imposent l'identification effective par login/mot de passe.
C'est ce qui est fait déjà !! Au même titre que phpbb, quand tu veux changer l'e-mail et passe l'utilisateur doit confirmer l'ancien passe...

Ce que je voudrais en fait c'est un peu ce que propose phpbb..

Malheureusement j'arrive vraiment pas a voir cmt il arrive a gérer les sessions dans la table..

Mammouth du PHP | 19672 Messages

19 avr. 2008, 23:26

As-tu songé à regarder ce qui était stocké dans les cookies de phpBB ? Si tu ne l'as pas installé sur Firefox, ajoute Firebug avec en plus une nouvelle extension qui vient de sortir, firecookie qui te permet de voir pas mal de détails sur ce que tu reçois comme cokkies et ce qu'il y a dedans. Tu pourras sans doute faire le parallèle avec le contenu de la base.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 189 Messages

19 avr. 2008, 23:35

Merci pour ton intérêt !!

Alors pour firebug je lui préfère web developper, du coup le rapprochement est déjà fait..

Quand on se log dans un forum phpbb on a trois cookie :
le sid
l'id utilisateur
et un nombre aléatoire dont je ne connais pas la signification (k ?)

Ces informations se retrouvent dans la base sessions avec en plus une date de connexion, la page courante et la durée limite du cookie..

Donc si on se base sur la durée de vie du cookie et que je fixe ce délais à 30 jours..
Les sessions plus âgée que 30 jours seront automatiquement nettoyé..

Mais est-ce vraiment ainsi que fonctionne phpbb ?

Et comment font-il pour fixer un lifetime de 1 an...

J'imagine mal un forum de 1000 inscris avec 1000 entrée dans la base session durant 1 ans même si des utilisateurs auront probablement formaté, ou supprimé les cookies pendant cette période :?