252 votes

Cookies sur localhost avec domaine explicite

Je dois rater quelque chose de fondamental à propos des cookies. Sur l'hôte local, lorsque je place un cookie du côté serveur et spécifier 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 est :

Set-Cookie:
    name=value;
    domain=localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

ou (lorsque je règle 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 pas utilisé d'outil supplémentaire, mais le cookie ne semble pas être stocké aussi bien, car il n'est pas renvoyé dans les requêtes ultérieures.

Opera 9.64 : Localhost et .localhost travail Mais lorsque je vérifie la liste des cookies dans les préférences, le domaine est défini sur localhost.local alors qu'il est répertorié sous localhost (dans le regroupement des listes).

Safari 4 : Localhost et .localhost travail 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 (sans point).

Quel est le problème avec localhost ? Vu le nombre d'incohérences, il doit y avoir des règles spéciales concernant localhost. En outre, je ne comprends pas très bien pourquoi les domaines doivent être préfixés par un point ? La RFC 2109 le stipule explicitement :

La valeur de l'attribut Domain ne contient pas de points incorporés ou ne commence pas par un point.

Pourquoi ? Le document indique que cela a un rapport avec la sécurité. Je dois admettre que je n'ai pas lu toute la spécification (je le ferai peut-être plus tard), mais cela semble un peu étrange. Sur cette base, il serait impossible d'installer des cookies sur localhost.

36 votes

Un fil de discussion vieux de 6 ans et c'est toujours un problème. J'utilise Chrome v40. Voir aquí .

7 votes

Chrome 43... toujours un bug.

7 votes

Chrome 54 ici, NON résolu

292voto

Ralph Buchfelder Points 928

Par conception, les noms de domaine doivent comporter au moins deux points, sinon le navigateur les considère comme invalides. (Voir la référence sur http://curl.haxx.se/rfc/cookie_spec.html )

Lorsque vous travaillez sur localhost le domaine du cookie doit être entièrement omis . Vous ne devez pas le régler sur "" o NULL o FALSE au lieu de "localhost" . Ce n'est pas suffisant.

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 la fonction cookie.setDomain("...") du tout.

117 votes

Je ne sais pas pourquoi tout le monde est +1'ing, j'ai mis le domaine du cookie à null ou false ou une chaîne vide et il n'enregistre toujours pas si sur localhost.

8 votes

Je ne vois rien dans la RFC6265 concernant les deux points dans le domaine : tools.ietf.org/html/rfc6265#section-5.2.3 .Net dit de le définir sur ".local" pour tous les hôtes de votre domaine local. Ce qui semble cohérent avec Opera/Safari msdn.microsoft.com/fr/us/library/ckch3yd2.aspx

1 votes

@Justin, j'ai obtenu une NullPointerException lorsque Domain est défini comme nul !

43voto

xgretsch Points 452

Je suis globalement d'accord avec @Ralph Buchfelder, mais voici une amplification de ceci, par expérience en essayant de reproduire un système avec plusieurs sous-domaines (comme exemple.com, fr.exemple.com, de.exemple.com) sur ma machine locale (OS X / Apache / Chrome|Firefox).

J'ai modifié /etc/hosts pour faire pointer certains sous-domaines imaginaires vers 127.0.0.1 :

127.0.0.1 localexample.com
127.0.0.1 fr.localexample.com
127.0.0.1 de.localexample.com

Si je travaille sur fr.localexample.com et que j'omets le paramètre de domaine, 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 es visible dans d'autres sous-domaines.

Si j'utilise un domaine de "localexample.com", ou si j'essaie un domaine de seulement "localexample" ou "localhost", le cookie n'est 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.

Ainsi, l'exigence selon laquelle il faut au moins deux points dans le domaine semble être correcte, même si je ne vois pas pourquoi elle devrait l'être.

Si quelqu'un veut essayer, voici un code utile :

<html>
<head>
<title>
Testing cookies
</title>
</head>
<body>
<?php
header('HTTP/1.0 200');
$domain = 'fr.localexample.com';    // Change this to the domain you want to test.
if (!empty($_GET['v'])) {
    $val = $_GET['v'];
    print "Setting cookie to $val<br/>";
    setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain);
}
print "<pre>";
print "Cookie:<br/>";
var_dump($_COOKIE);
print "Server:<br/>";
var_dump($_SERVER);
print "</pre>";
?>
</body>
</html>

40voto

AmpT Points 531

localhost : Vous pouvez utiliser : domain: ".app.localhost" et cela fonctionnera. Le site Le paramètre 'domain' doit contenir 1 ou plusieurs points. dans le nom de domaine pour l'installation des cookies. Vous pouvez alors faire fonctionner des sessions à travers des sous-domaines de localhost tels que : api.app.localhost:3000 .

2 votes

Également testé et fonctionnant sur un serveur node.js, en utilisant Express 3.x, en express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})

4 votes

Ceci devrait être sélectionné comme réponse si vous utilisez des domaines locaux ! Le fait de mettre un point avant le sous-domaine résout mon problème.

1 votes

Alors, où est-ce que cette préposition du .app. venant de ? Fait-elle partie d'un certain SPEC ? Et est-il applicable à tous les domaines non conformes (ceux qui n'ont pas deux points) ? Par ailleurs, cela fonctionnera-t-il avec les anciens navigateurs ? :^)

20voto

Scott Munro Points 4008

Lorsqu'un cookie est défini avec un domaine explicite de 'localhost' comme suit...

Set-Cookie : name=value ; domaine=localhost ; expires=Thu, 16-Jul-2009 21:25:05 GMT ; path=/

...puis les navigateurs l'ignorent parce qu'elle ne comprend pas au moins deux points et n'est pas l'un des sept domaines de premier niveau spécialement traités .

...les domaines doivent comporter au moins deux (2) ou trois (3) points afin de empêcher les domaines de la forme : ".com", ".edu", et "va.us". Tout domaine qui échoue dans l'un des sept domaines de premier niveau spéciaux énumérés ci-dessous ci-dessous ne nécessite que deux points. Tout autre domaine nécessite au moins trois. Les sept domaines spéciaux de premier niveau sont : "COM", "EDU", "NET", "ORG", "GOV", "MIL", et "INT".

Notez que le nombre de points ci-dessus suppose probablement qu'un point de tête est nécessaire. Or, ce point est ignoré dans les navigateurs modernes et il devrait probablement lire...

au moins un (1) ou deux (2) périodes

Notez que la valeur par défaut de l'attribut domain est le nom d'hôte du serveur qui a généré la réponse du cookie .

Alors une solution de contournement pour que les cookies ne soient pas définis pour localhost est de 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 domain.

0 votes

Je n'ai pas fait de DV, mais je suppose que la raison pour laquelle d'autres l'ont fait est que votre réponse n'apporte pas vraiment de valeur ajoutée. L'exigence des deux périodes et le fait de laisser l'attribut domain vide ont tous deux été abordés dans d'autres réponses. En outre, les informations que vous avez ajoutées concernant le domaine de premier niveau semblent incorrectes. D'après mon expérience, ce n'est pas une exigence.

0 votes

@TTT Je ne suis pas sûr que vous ayez compris le passage de ma réponse où je dis qu'il faut au moins un ou deux points selon le TLD, car les points de tête sont ignorés ? J'ai donc fourni quelques informations sur le problème et ajouté un point qui, à mon avis, n'est pas couvert ailleurs - les règles sont différentes pour un domaine explicite et celui que le navigateur utilise par défaut. Il me semble que cela apporte une certaine valeur ajoutée.

2 votes

Le fait de laisser le domaine nul (de ne pas le définir du tout) n'amène pas Chrome à conserver le cookie pour localhost. Il l'ignore toujours. Notez que cela ne s'applique qu'aux cookies "permanents" (ceux qui ont une date d'expiration), car il conservera les cookies "de session" pour localhost (ceux qui n'ont pas de date d'expiration).

11voto

Aidan Ewen Points 4364

Si vous définissez un cookie à partir d'un autre domaine (c'est-à-dire que vous définissez le cookie en effectuant une demande XHR d'origine croisée), vous devez vous assurer que vous définissez le paramètre withCredentials à true sur la requête XMLHttpRequest que vous utilisez pour récupérer le cookie, comme décrit ci-dessous aquí

1 votes

Oui, même avec ça. Cela ne fonctionne toujours pas avec les requêtes inter-domaines. Navigateur - Safari, IE 11

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