Sécurité des cookies de sessions

Signaler
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005
-
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005
-
Voilà le topo. Le client se connecte au serveur. S'il n'envoit pas de cookie de session, le serveur répond par un

Set-Cookie: PHPSESSID=blabla...; path=/

bon. Une fois le cookie acquis, le client va alors envoyer à chaque fois qu'il demande une page son cookie de session via un

Cookie: PHPSESSID=blabla...



Le problème, le voici. Supposons que j'ai mon site à l'adresse A.domain.com et considérons un autre site B.domain.com. Si un client va sur mon site A.domain.com et ouvre une session, le browser va stocker le cookie comme appartenant au

domain A.domain.com. No problem. Mais. Si j'envoie le cookie comme ceci :

Set-Cookie: PHPSESSID=abc; expires=Mon, 02-Aug-10 14:02:31 GMT; path=/; domain=domain.com

le cookie PHPSESSID est stocké dans le browser comme appartenant au domaine .domain.com.



S'il n'y a pas de cookie PHPSESSID défini pour B.domain.com, le browser récupère le cookie de mon site, et se connecte avec LE MEME identifiant de session au site B.domain.com ...



Celà veut dire que le client qui est passé par le site A s'autentifiera
avec le même numéro de session à chaque fois (expires fait que ce
cookie n'est pas détruit), numéro que je connais ...



Ma question donc... êtes vous au courant de ce problème ? Quelles stratégies pour y remédier ?



Il est possible que ce post soit hors-sujet... comme il traite de
sécurité peut-être d'un peu trop près... il est possible que de
nombreux sites soient vulnérables, ma motivation n'est pas de propager
une vulnérabilité mais d'essayer de trouver une solution ...

28 réponses

Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005

il fallait bien sûr lire

domain=.domain.com
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
15
Hello,



Je ne connaissais pas ce problème, mais en lisant ton poste, je pense que ce n'est pas trop difficile de parer le problème.



Si tu as ton premier site qui s'appelle a.domaine.com,
$_SERVER['REQUEST_URI'] te donnera 'a' puisque a.domaine.com est la
redirection de domaine.com/a, donc il te suffit d'ajouter cette info
dans ton cookie (de manière cryptée ou non) et de faire un strcmp entre
le $_SERVER['REQUEST_URI'] du cookie et celui du site!



Maintenant je n'exclue pas qu'il existe une solution plus simple liée directement aux cookies, mais pour ça, rdv sur php.net



Enjoy, ++
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
Ce n'est pas un problème, c'est la manière que fonctionne les cookies ... quel est le problème réel? remédier à quoi ?

Si tu veux, jpense que tu peux mapper ton cookie sur www.domain.com ou direct sur domain.com (Sans le .)

, EssayezTestez avant de Poser une question !
http://www.lookstrike.com
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005

l'id de session contenu dans le cookie est un secret partagé entre le
client et le serveur. Si quelqu'un d'autre connait cet id, il peut se
faire passer pour le client.

Un exemple : tu vas sur perso.domain.com, tu choppes un PHPSESSID=abc sur .domain.com

Ensuite (un autre jour ...) tu vas sur mail.domain.com où tu
t'authentifies. Le webmaster de perso.domain.com peut alors lire tes
mails en utilisant comme cookie de session PHPSESSID=abc. Le serveur
voit "abc", donc il identifie la même personne.

Le "mappage" est très strict... justement pour éviter le vol de cookies
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
Salut,



comme l'a dit Grenard ce n'est pas un problème... En gros tu as
plusieurs site sur un même domaine (tu gères donc ça via des sous
domaines) et t'as un problème de ce type ? bah dans "domain" pour
l'enregistrement du cookie tu mets "sousdomaine.domaine.com"

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005

le problème n'est pas si simple. Le serveur ne reçoit pas le domaine du
cookie. Il voit un cookie du client, il pense que c'est lui-même (le
serveur) qui l'a créé.

un session_open ne suffit pas, il faut regénérer l'id de session.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
http://fr.php.net/manual/fr/function.setcookie.php



et ensuite modifie pour chacun de tes sous domaines la valeur "session.cookie_domain"
dans le php.ini (ou à l'aide d'un htaccess si ini_set() n'est pas dispo)
<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005

que proposerais-tu a un hébergeur mutualisé ? Si un mec sur
A.domain.com décide de s'en prendre à B.domain.com, que peut faire B
pour le prémunir ?
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
ce que je viens de dire au dessus, sur le site B tu modifies le
session.cookie_domain en l'adaptant au site B (tu inclues le sous
domaine) et pareil pour le site A.

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005

Le serveur ne va envoyer de cookie que si le client n'en envoit pas.
Par ailleurs, le client envoit son cookie sans spécifier le domaine qui
lui correspond. C'est la configuration classique que tu proposes : le
serveur envoit des cookies pour le site et non pour le domaine. Mais ce
n'est pas le problème ici. Le problème ici c'est de se débarasser du
cookie initial du client.



Les solutions sont :

- pour les browsers, désactiver les cookies sur les domaines

- pour les programmeurs de sites webs : rafraichir les ids de session lors de l'authentification

- pour les hébergeurs : filtrer les en-têtes des réponses du serveur



Par ailleurs, le problème ne semble pas spécifique à php.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
non mais sérieux quel est ton problème ? tu as deux sites du même
domaine et tu ne veux pas que les sessions du site A soient visibles
sur le site B ? ou alors j'ai pas tout compris... parce que si ton
problème est celui-ci, vu que les sites ne peuvent lire les cookies que
pour leur unique domaine, ton problème ne devrait plus se poser...

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005

Justement si. Quand tu te connectes au site B.domain.com, le browser
envoit tous les cookies du domaine B.domain.com et tous les cookies du
domain .domain.com, or ces derniers peuvent être aussi envoyés par
A.domain.com

Quand A.domain.com veut t'envoyer un cookie, le browser le stoque pour
le domaine A.domain.com, mais si A.domain.com rajoute une option
"domain=.domain.com" le browser accepte le cookie pour le domaine
.domain.com

Je ne sais pas si je suis super clair là ...

Concrètement tu es sur mechant.free.fr. Tu choppes un PHPSESSID=abc pour .free.fr

Ensuite tu ouvres une session sur forum.free.fr. Une fois authentifié,
mechant peut se faire passer pour toi sur gentil.free.fr en utilisant
PHPSESSID=abc
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
oui donc bah tu configures le domain en rajoutant le sous domaine, et
plus de problème, comme j'ai écris plus haut... dans les paramètres
session.cookie_domain



par contre sur free je sais pas si c'est possible, j'avais essayé de
bidouiller des valeurs via htaccess, erreur 500 (free power)



Il te reste une autre solution, changer le nom de l'id de session sur
tes différents sites, comme ça le cookie PHPSESSID n'est plus valide.

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
15
Je veux pas avoir l'air d'insister , mais Si tu as ton premier site qui s'appelle a.domaine.com, $_SERVER['REQUEST_URI'] te donnera 'a' puisque a.domaine.com est la redirection de domaine.com/a, donc il te suffit d'ajouter cette info dans ton cookie (de manière cryptée ou non) et de faire un strcmp entre le $_SERVER['REQUEST_URI'] du cookie et celui du site. En d'autres termes, tu peux (en gros) utiliser ton sous-domaine comme cle de dryptage du cookie, ainsi si il est choppe par un autre sous domaine, il est ilisible... moins ca me semble viable
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
pourquoi pas, c'est une solution :-)



sinon au pire il te reste à gérer toi-même tes sessions via une base de
données ou un dossier et des fichiers session, c'est largement jouable
;-)

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005

Anthomicro: mais le serveur ne connait pas le domaine du cookie du client !

malik7934: non. Si mon serveur mechant A.domain.com fait une
requete à B.domain.com pour obtenir un id de session, et qu'il passe
ensuite cette valeur au browser avec comme domain .domain.com, le
cookie sera partagé entre A, B, et le client, et B acceptera le cookie
puisque c'est lui qui l'a créé.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
"

Anthomicro: mais le serveur ne connait pas le domaine du cookie du client !"



Non, mais quand t'es sur le site A.domain.com, tu sais très bien que
ton sous-domaine est A, bref dans tes scripts tu configures le
session.cookie_domain en "A.domain.com"


Enfin je pense qu'on se comprend pas, tant pis essaie quand même
<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005

oui, on ne doit pas se comprendre, mais j'essaie quand même :

je me connecte sur B.domain.com, sans cookie. Celui-ci me renvoit un
cookie avec comme domain B.domain.com parceque justement il a son
session.cooke_domain configuré comme tu le veux, MAIS

si tu te connectes sur B.domain.com, avec un cookie, B ne vas pas te renvoyer un cookie.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
heu je comprends de moins en moins... Si t'as déjà un cookie pourquoi veux-tu qu'il t'en renvoit un ?

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
196
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
2 septembre 2005

justement, il n'en renvoit pas... le serveur croit que le cookie envoyé
par le browser est un cookie sûr qui n'est connu que par eux deux ...
or ce n'est pas le cas.