Il me manque quelque chose de basique sur les cookies. Sur localhost, lorsque je place un cookie côté serveur et que je spécifie explicitement le domaine comme localhost (ou .localhost). le cookie ne semble pas être accepté par certains navigateurs.
Firefox 3.5: J'ai vérifié la requête HTTP dans Firebug. Ce que je vois c'est:
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
ou (lorsque j'ai défini le domaine sur .localhost):
Set-Cookie:
name=value;
domain=.localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
Dans les deux cas, le cookie n'est pas stocké.
IE8: Je n'ai utilisé aucun outil supplémentaire, mais le cookie ne semble pas non plus stocké, car il n'est pas renvoyé dans les demandes suivantes.
Opera 9.64: localhost et .localhost fonctionnent tous les deux , mais lorsque je vérifie la liste des cookies dans Préférences, le domaine est défini sur localhost.local même s'il est répertorié sous localhost (dans le regroupement de la liste).
Safari 4: localhost et .localhost fonctionnent , mais ils sont toujours répertoriés comme .localhost dans les préférences. D'autre part, un cookie sans domaine explicite, il est affiché comme juste localhost (pas de point).
Quel est le problème avec localhost? En raison d'un tel nombre d'incohérences, il doit y avoir des règles spéciales impliquant localhost. De plus, je ne vois pas tout à fait pourquoi les domaines doivent être précédés d'un point? La RFC 2109 déclare explicitement que:
La valeur de l'attribut Domaine ne contient aucun point incorporé ou ne commence pas par un point.
Pourquoi? Le document indique qu'il doit faire quelque chose avec la sécurité. Je dois admettre que je n'ai pas lu toute la spécification (peut-être le faire plus tard), mais cela semble un peu étrange. Sur cette base, la configuration de cookies sur localhost serait impossible.
Réponses:
De par leur conception, les noms de domaine doivent avoir au moins deux points; sinon le navigateur les considérera invalides. (Voir référence sur http://curl.haxx.se/rfc/cookie_spec.html )
Lorsque vous travaillez dessus
localhost
, le domaine du cookie doit être entièrement omis. Il ne suffit pas de le régler sur""
ouNULL
ouFALSE
au lieu de"localhost"
.Pour PHP, voir les commentaires sur http://php.net/manual/en/function.setcookie.php#73107 .
Si vous travaillez avec l'API Java Servlet, n'appelez pas du
cookie.setDomain("...")
tout la méthode.la source
Domain=
paramètre lors de la configuration du cookie. Si vous définissez simplement le domaine sur null ou vide, votre framework enverra peut-être leDomain=
paramètre avec cette valeur, au lieu de l'omettre? Vérifiez avec par exemple Firebug.((domain && domain !== "localhost") ? ";domain="+domain : "")
Je suis globalement d'accord avec @Ralph Buchfelder, mais voici une amplification de cela, par expérience en essayant de répliquer un système avec plusieurs sous-domaines (tels que example.com, fr.example.com, de.example.com) sur ma machine locale ( OS X / Apache / Chrome | Firefox).
J'ai édité / etc / hosts pour pointer certains sous-domaines imaginaires à 127.0.0.1:
Si je travaille sur fr.localexample.com et que je laisse le paramètre de domaine de côté, le cookie est stocké correctement pour fr.localexample.com, mais n'est pas visible dans les autres sous-domaines.
Si j'utilise un domaine de ".localexample.com", le cookie est stocké correctement pour fr.localexample.com, et est visible dans d'autres sous-domaines.
Si j'utilise un domaine de "localexample.com", ou lorsque j'essayais un domaine de "localexample" ou "localhost", le cookie n'était pas stocké.
Si j'utilise un domaine de "fr.localexample.com" ou ".fr.localexample.com", le cookie est stocké correctement pour fr.localexample.com et est (correctement) invisible dans les autres sous-domaines.
Donc, l'exigence selon laquelle vous avez besoin d'au moins deux points dans le domaine semble être correcte, même si je ne vois pas pourquoi cela devrait être.
Si quelqu'un veut essayer ceci, voici un code utile:
la source
localhost: Vous pouvez utiliser:
domain: ".app.localhost"
et cela fonctionnera. Le paramètre «domaine» a besoin d'un ou plusieurs points dans le nom de domaine pour définir les cookies. Ensuite , vous pouvez avoir des séances de travail à travers les sous - domaines localhost tels que:api.app.localhost:3000
.la source
express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
.app.
venue? Cela fait-il partie d'un SPEC? Et est-ce applicable à tous les domaines non conformes (ceux sans deux points)? Cela fonctionnera-t-il également avec les anciens navigateurs? : ^)Lorsqu'un cookie est défini avec un domaine explicite de 'localhost' comme suit ...
... alors les navigateurs l'ignorent car il n'inclut pas au moins deux périodes et ne fait pas partie des sept domaines de premier niveau spécialement gérés .
Notez que le nombre de périodes ci-dessus suppose probablement qu'une période de début est nécessaire. Cette période est cependant ignorée dans les navigateurs modernes et elle devrait probablement lire ...
Notez que la valeur par défaut de l'attribut de domaine est le nom d'hôte du serveur qui a généré la réponse du cookie .
Ainsi, une solution de contournement pour les cookies non définis pour localhost consiste simplement à ne pas spécifier d'attribut de domaine et à laisser le navigateur utiliser la valeur par défaut - cela ne semble pas avoir les mêmes contraintes qu'une valeur explicite dans l'attribut de domaine.
la source
Si vous définissez un cookie d'un autre domaine (c'est-à-dire que vous définissez le cookie en effectuant une requête d'origine croisée XHR), vous devez vous assurer que vous définissez l'
withCredentials
attribut sur true sur la XMLHttpRequest que vous utilisez pour récupérer le cookie comme décrit icila source
Les résultats que j'avais varient selon le navigateur.
Chrome- 127.0.0.1 fonctionnait mais localhost .localhost et "" ne le faisaient pas. Firefox- .localhost fonctionnait mais localhost, 127.0.0.1 et "" ne fonctionnaient pas.
N'ont pas testé dans Opera, IE ou Safari
la source
Domain=
paramètre fonctionne.Domain=
fonctionne également, maisDomain=localhost
ne fonctionne pas.J'ai passé beaucoup de temps à résoudre ce problème moi-même.
Utiliser PHP, et rien sur cette page n'a fonctionné pour moi. J'ai finalement réalisé dans mon code que le paramètre «secure» de session_set_cookie_params () de PHP était toujours réglé sur TRUE.
Comme je ne visitais pas localhost avec https, mon navigateur n'accepterait jamais le cookie. Donc, j'ai modifié cette partie de mon code pour définir conditionnellement le paramètre «secure» basé sur $ _SERVER ['HTTP_HOST'] étant 'localhost' ou non. Fonctionne bien maintenant.
J'espère que ça aidera quelqu'un.
la source
J'ai eu beaucoup plus de chance de tester localement en utilisant 127.0.0.1 comme domaine. Je ne sais pas pourquoi, mais j'ai eu des résultats mitigés avec localhost et .localhost, etc.
la source
vous pouvez utiliser
localhost.org
ou plutôt.localhost.org
il se résoudra toujours à127.0.0.1
la source
Aucun des correctifs suggérés n'a fonctionné pour moi - le définir sur null, false, ajouter deux points, etc. - n'a pas fonctionné.
En fin de compte, je viens de supprimer le domaine du cookie s'il s'agit de localhost et cela fonctionne maintenant pour moi dans Chrome 38 .
Code précédent (n'a pas fonctionné):
Nouveau code (fonctionne maintenant):
la source
Il y a un problème sur Chromium ouvert depuis 2011 , si vous définissez explicitement le domaine en tant que 'localhost', vous devez le définir comme
false
ouundefined
.la source
Domain: undefined
etPath: '/'
J'ai eu le même problème et je l'ai résolu en mettant 2 points dans le nom du cookie lui-même sans spécifier de domaine.
la source
Il semble y avoir un problème lorsque vous utilisez
https://<local-domain>
et ensuitehttp://<local-domain>
. Lehttp://
site n'envoie pas de cookies avec les demandes une fois que lehttps://
site les a définis. Forcer le rechargement et vider le cache n'aide pas. Seule la suppression manuelle des cookies fonctionne. De plus, si je les efface sur lahttps://
page, lahttp://
page recommence à fonctionner.Semble être lié aux "cookies sécurisés stricts". Bonne explication ici . Il a été publié dans Chrome 58 le 19/04/2017.
Il semble que Chrome enregistre en fait à la fois les cookies sécurisés et les cookies non sécurisés, car il affichera les cookies appropriés en fonction du protocole de la page lorsque vous cliquez sur l'icône de la barre d'adresse.
Mais
Developer tools > Application > Cookies
ne montrera pas de cookie non sécurisé lorsqu'il existe un cookie sécurisé du même nom pour le même domaine, ni n'enverra le cookie non sécurisé avec des demandes. Cela semble être un bogue de Chrome, ou si ce comportement est attendu, il devrait y avoir un moyen d'afficher les cookies sécurisés lorsqu'ils sont sur unehttp
page et une indication qu'ils sont remplacés.La solution de contournement consiste à utiliser des cookies nommés différents selon qu'ils sont destinés à un site http ou https, et à les nommer spécifiquement pour votre application. Un
__Secure-
préfixe indique que le cookie doit être strictement sécurisé et constitue également une bonne pratique car sécurisé et non sécurisé ne se heurteront pas. Les préfixes présentent également d' autres avantages .L'utilisation de
/etc/hosts
domaines différents pour l'accès https par rapport à l'accès http fonctionnerait également, mais unehttps://localhost
visite accidentelle empêchera tous les cookies du même nom de fonctionner sur leshttp://localhost
sites - ce n'est donc pas une bonne solution de contournement.J'ai déposé un rapport de bogue Chrome .
la source
Après beaucoup d'expérimentation et de lecture de divers articles, cela a fonctionné. Je pourrais définir plusieurs cookies, les relire et définir l'heure négative et les supprimer.
la source
La seule chose qui a fonctionné pour moi était de mettre
Path=/
le cookie.De plus, la valeur par défaut d'un attribut de chemin semble être différente d'un navigateur à l'autre bien que je n'en ai testé que deux (Firefox et Chrome).
Chrome essaie de définir un cookie tel quel; si l'
path
attribut est omis dans l'en-Set-Cookie
tête, il ne sera pas stocké et ignoré.Cependant, Firefox stocke un cookie même sans
path
attribut explicite . Il l'a simplement défini avec le chemin demandé; mon URL de demande était/api/v1/users
et le chemin a été défini sur/api/v1
automatiquement.Quoi qu'il en soit, les deux navigateurs fonctionnaient quand
path
était réglé sur/
même sans domaine explicite, c'est à direDomain=localhost
ou quelque chose. Il existe donc des différences dans la manière dont chaque navigateur gère les cookies.la source
document.cookie = nom_valeur + "=" + valeur + ";" + expire + "; domaine =; chemin = /";
ce "domaine =; chemin = /"; prendra le domaine dynamique car son cookie fonctionnera dans le sous-domaine. si vous voulez tester dans localhost cela fonctionnera
la source
Aucune des réponses ici n'a fonctionné pour moi. Je l'ai corrigé en mettant mon PHP comme toute première chose dans la page.
Comme les autres en-têtes, les cookies doivent être envoyés avant toute sortie de votre script (il s'agit d'une restriction de protocole). Cela nécessite que vous appeliez cette fonction avant toute sortie, y compris les balises et ainsi que les espaces.
Depuis http://php.net/manual/en/function.setcookie.php
la source
Je jouais un peu.
fonctionne dans Firefox et Chrome à partir d'aujourd'hui. Cependant, je n'ai pas trouvé de moyen de le faire fonctionner avec curl. J'ai essayé Host-Header et --resolve, pas de chance, toute aide appréciée.
Cependant, cela fonctionne dans curl, si je le règle sur
au lieu. (Ce qui ne fonctionne pas avec Firefox.)
la source
Autre détail important, expires = doit utiliser le format de date et d'heure suivant: Wdy, DD-Mon-YYYY HH: MM: SS GMT ( RFC6265 - Section 4.1.1 ).
la source
J'ai essayé toutes les options ci-dessus. Ce qui a fonctionné pour moi était:
Domain
Path=/
En-
Set-Cookie
tête résultant :la source
Le cookie doit spécifier un
SameSite
attribut, laNone
valeur étant la valeur par défaut, mais les versions récentes du navigateur ont définiLax
la valeur par défaut pour avoir une défense raisonnablement robuste contre certaines classes d'attaques de falsification de requête intersites (CSRF).En même temps que
SameSite=Lax
vous devriez également avoirDomain=localhost
, votre cookie sera associélocalhost
et conservé. Ça devrait ressembler a quelque chose comme ca:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
la source