9 votes

Le cookie ne se renouvelle pas/ne s'écrase pas dans IE

J'ai un problème bizarre avec les cookies dans IE. Lorsqu'un utilisateur se connecte au site, je génère un nouvel identifiant de session et je dois donc écraser le cookie. Le processus est le suivant :

  1. Le client se rend à https://secure.example.com/users/login en recevant automatiquement un identifiant de session

  2. Le client envoie ses identifiants de connexion à la même adresse.

  3. Le client reçoit les en-têtes set-cookie suivants ainsi qu'une redirection 302 vers https://secure.example.com/users/mypage :

    CAKEPHP=deleted ; expires=Sun, 05-Apr-2009 04:50:35 GMT ; path=/
    CAKEPHP=98hnIO23... ; expires=Mon, 12 Apr 2010 04:50:36 GMT ; path=/ ; secure

  4. Le client est censé visiter https://secure.example.com/users/mypage en présentant le nouvel identifiant de session.

Cela fonctionne dans tous les navigateurs, sauf IE (testé dans 7 et 8). IE conserve l'ancien identifiant de session non authentifié et est redirigé vers la page de connexion. Cela fonctionne dans mon environnement de test local (en utilisant un certificat auto-signé à l'adresse suivante https://localhost:8443/... ), mais pas sur le serveur en direct.

J'utilise CakePHP et émet simplement un $this->Session->renew() qui produit les en-têtes de cookie ci-dessus.

Avez-vous des idées pour faire en sorte qu'IE accepte le nouveau cookie ?


Voici l'en-tête complet :

HTTP/1.0 302 Moved Temporarily
Date: Thu, 08 Apr 2010 02:54:30 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Set-Cookie: CAKEPHP=deleted; expires=Wed, 08-Apr-2009 02:54:30 GMT; path=/
Set-Cookie: CAKEPHP=d55c...; expires=Thu, 15 Apr 2010 02:54:31 GMT; path=/; secure
Last-Modified: Thu, 08 Apr 2010 02:54:30 GMT
Location: https://secure.example.com/users/mypage
Vary: Accept-Encoding
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8

Je pense avoir trouvé le problème : IE envoie deux des cookies de nom identique. Voici la prochaine requête au serveur :

GET /users/mypage HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, */ *
Referer: https://secure.example.com/users/login
Accept-Language: en-gb
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)
Accept-Encoding: gzip, deflate
Host: secure.example.com
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: CAKEPHP=19c6...; CAKEPHP=d55c...

Remarquez qu'il envoie deux cookies, celui qu'il a reçu après s'être connecté, mais aussi l'ancien. Il a reçu l'ancien cookie sur la page principale example.com set avec path=/ . Il l'envoie aussi pour des demandes de secure.example.com . Il n'est pas remplacé par l'en-tête ci-dessus, mais il est ajouté comme cookie supplémentaire. Comment puis-je l'empêcher de faire cela ?

4voto

EricLaw Points 28850

Un problème courant est que la deuxième tentative de définir le cookie ne dispose pas d'un en-tête P3P correct et que la tentative de toucher le cookie est donc ignorée.

Il serait utile que vous affichiez les en-têtes du flux global (par exemple, utiliser Fiddler pour capturer et regarder)

3voto

eglasius Points 26221

Assurez-vous que les cookies sont émis pour votre domaine de base.

C'est très probablement le problème, car ce comportement varie certainement selon les navigateurs.

Je ne l'ai pas fait dans cakephp, mais cela devrait fonctionner

2voto

pestilence669 Points 4009

Vous avez peut-être deux problèmes ici. D'abord, essayez le lien dans le message de @freddy-rios. Si cela ne fonctionne pas, il se peut que vous rencontriez le "cookie de redirection" d'IE.

IE ne respecte pas toujours la modification des cookies lors de la redirection. Si vous attribuez un ID de session dans le formulaire de connexion et que vous ne le modifiez pas, la redirection devrait fonctionner correctement. Si vous modifiez un cookie lors de la redirection, vous vous retrouverez probablement avec l'ancienne session... le navigateur soumettra simplement l'ancien cookie à la nouvelle URL (ce qu'il est censé faire... rediriger la requête originale).

Il y a plusieurs façons de faire face à ce problème. La plus vilaine, et de loin, consiste à utiliser une redirection par Javascript ou par balise META. Tant que vous passez un non-300 avec ces cookies, le navigateur les acceptera presque toujours.

Si vous utilisez $this->Session->renew() le fait de le supprimer peut résoudre tous vos problèmes... surtout s'il appelle session_regenerate_id() sous le capot.

Je suggère de supprimer la redirection et de voir si le problème persiste. Si c'est le cas, vous pouvez ignorer tout ce que j'ai dit :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X