web-dev-qa-db-fra.com

Safari ne définit pas de cookie mais IE / FF le fait

J'ai trouvé un étrange problème de cookie sur Safari. Si vous surfez sur http://2much.ch vous pouvez entrer avec FF/IE et surfer sur le site.

Mais si vous utilisez safari, vous ne pouvez entrer qu'une seule fois; vous ne pouvez pas surfer sur le site. J'ai trouvé que Safari ne définit pas le cookie entré, mais FF/IE le fait.

Qu'est-ce qui ne va pas ici?

44
Gomez

Il semble que vous ayez rencontré un bogue Safari ici; vous redirigez tout navigateur visitant vers/entrée tout en configurant le cookie en même temps, et Safari ignore l'en-tête Set-Cookie lorsqu'il rencontre le statut HTTP 302:

$ curl -so /dev/null -D - http://4much.schnickschnack.info/
HTTP/1.1 302 Moved Temporarily
Server: nginx/0.7.61
Date: Sun, 19 Jul 2009 12:20:49 GMT
Content-Type: text/html;charset=utf-8
Connection: keep-alive
Content-Length: 14260
Content-Language: de
Expires: Sat, 1 Jan 2000 00:00:00 GMT
Location: http://4much.schnickschnack.info/entry
Set-Cookie: colorstyle="bright"; Path=/; Expires=1248092449.12
Set-Cookie: _ZopeId="73230900A39w5NG7q4g"; Path=/

Techniquement, ce serait un bogue dans les classes de base d'Apple, j'ai trouvé un bogue WebKit qui indique que c'est le cas.

Je suppose que la solution de contournement consiste à définir le cookie non pas dans index_html mais en entrée à la place.

Dans les années qui ont suivi ma première réponse à cette question, ce problème semble maintenant résolu, du moins c'était pour Safari 6 lorsque quelqu'un a testé tous les principaux navigateurs pour la prise en charge de Set-Cookie sur 302 redirections en 2012 .

63
Martijn Pieters

Il semble que ce ne soit plus un problème. Voir http://blog.dubbelboer.com/2012/11/25/302-cookie.html

7
Iker Jimenez

Il y a un mois, j'ai rencontré ce problème. Au début, je pensais que c'était un pot de cookies corrompu car je pouvais nettoyer les cookies et partir.

Cependant, il est réapparu. Cette fois, j'ai passé une heure à le parcourir, à regarder ce qui a été envoyé, à revoir ce que le safari a renvoyé, et j'ai trouvé le problème.

Dans ce cas, j'avais un tableau de valeurs de cookies envoyé au navigateur après la connexion avant la redirection. Les valeurs ressemblaient à quelque chose comme 'id utilisateur', 'nom complet de l'utilisateur', 'un autre id', etc.

(oui, les identifiants sont cryptés donc pas de soucis là-bas)

Mon nom complet d'utilisateur était en fait dans un <lastname>, <firstname> format.

Lorsque safari publiait le cookie sur le serveur, tout ce qui se trouvait après la virgule après le nom de famille avait été supprimé. Il ne faisait que publier des valeurs jusque-là.

Lorsque j'ai supprimé la virgule, le reste des valeurs a commencé à fonctionner correctement.

Il semble donc que si vous envoyez une valeur de cookie qui contient une virgule, alors safari n'échappe pas correctement à cela dans son stockage interne. Ce qui m'amène à penser que s'ils n'échappent pas correctement aux virgules, il y a probablement des problèmes de sécurité avec le code de gestion des cookies de Safari.

Soit dit en passant, cela a été testé sur Win 7 x64 avec safari 4.0.5. J'ai également mis en place une page Web à l'adresse: http://cookietest.livelyconsulting.com/ qui montre ce problème exact. (J'ai supprimé ce site de test)

IE, FF et chrome tous définissent correctement le cookie. Safari ne le fait pas.

6
NotMe

Nous avons rencontré un problème très similaire où Safari (v. 7.0.6) ignorerait un cookie. L'en-tête du cookie avait l'air parfaitement bien, presque identique à un autre cookie dont était mémorisé.

Il s'est avéré que le coupable était l'en-tête du cookie précédent ayant une valeur expires malformée. La gestion par Safari des en-têtes de cookies cassés n'est évidemment pas aussi robuste que celle des autres navigateurs.

3
Dag Høidahl

J'ai rencontré le même problème avec Chrome. Chrome n'ignore pas l'en-tête set-cookie pendant que vous redirigez, mais vous ne connaissez jamais l'ordre (définissez d'abord le cookie ou redirigez d'abord). Voici quelque chose que j'ai essayé:

J'ai un site Web qui prend en charge l'anglais et le français. Je l'ai implémenté (avec php) de cette façon:

localhost a un lien vers localhost/fr (qui définit le cookie en français et redirige vers localhost). Ça marche. (définir le cookie en premier)

localhost/path1 a un lien vers localhost/fr? return =/path1 (qui définit le cookie en français et redirige vers localhost/path1). Ça ne marche pas. (rediriger d'abord, la langue n'a pas changé)

localhost/path1 a un lien vers localhost/fr? return = www.google.com (qui définit le cookie en français et redirige vers google). Quand je suis revenu sur mon site, c'est en français. (ce qui signifie que set-cookie en français n'est pas ignoré, uniquement exécuté après la redirection)

J'espère que je serai clair, l'anglais est une langue étrangère pour moi.

2
user104338