web-dev-qa-db-fra.com

PHP: Contrôle du domaine / sous-domaine des cookies

Je travaille sur un site avec plusieurs sous-domaines, dont certains devraient avoir leur propre session.

Je pense que j'ai compris, mais j'ai remarqué quelque chose sur la gestion des cookies que je ne comprends pas. Je ne vois rien dans les documents qui l'explique, alors j'ai pensé que je verrais si quelqu'un ici a de la lumière pour éclairer la question.

Si je fais juste:

session_start();

Je me retrouve avec un cookie de session comme celui-ci:

subdomain.example.net

Cependant, si j'essaie de définir moi-même le domaine des cookies, soit comme

ini_set('session.cookie_domain', 'subdomain.example.net');

ou comme

session_set_cookie_params( 0, "/", "subdomain.example.net", false, false);

Je me retrouve avec un cookie pour .subdomain.example.net (notez le point d'ouverture), ce qui signifie, je crois, "correspondre à tous les sous-domaines (ou dans ce cas, les sous-sous-domaines).

Cela semble se produire avec tous mes cookies en fait, pas seulement la session. Si je mets moi-même le domaine des cookies, le point est automatiquement ajouté, ce qui signifie ce domaine et tous ses sous-marins. Si je ne configure pas le domaine, il le fait correctement en utilisant uniquement le domaine actuel.

Une idée de ce qui cause cela, et de ce que je peux faire pour contrôler ce point qui précède?

Merci!

30
Eli

Les fonctions de cookies de PHP préfixent automatiquement le domaine $ avec un point. Si vous ne souhaitez pas ce comportement, vous pouvez utiliser la fonction header . Par exemple:

header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net");
24
Brian Fisher

Si vous exécutez votre PHP sous " http://subdomain.example.net ", n'utilisez pas le domaine paramètre :

setcookie('cookiename','cookievalue',time()+(3600*24),'/');

Vous obtiendrez un cookie avec "subdomain.example.net" (et non ".subdomain.example.net")

17
Kevin Campion

Si vous lisez l'intégralité de la RFC 6265, vous vous rendrez compte que la seule façon appropriée d'avoir un cookie "Host-only" est de ne PAS définir l'attribut de domaine.

http://tools.ietf.org/html/rfc6265#section-5.4

12
stolsvik

Je me rends compte que c'est une vieille question mais j'avais ce problème et aucune des réponses ci-dessus ne l'a vraiment fait.

Je voulais définir le cookie de session pour un sous-domaine, mais également activer httponly et sécurisé.

Pour éviter un début. devant le sous-domaine, Kevin et stolsvik ont ​​raison de ne pas définir l'attribut de domaine.

Donc, pour ce faire et toujours pouvoir définir httponly et le mode sécurisé, définissez le domaine sur NULL comme suit:

session_set_cookie_params(0, '/', NULL, TRUE, TRUE);

Vous aurez maintenant un cookie de session, pour un sous-domaine spécifique (sans leader) avec httponly et sécurisé défini sur true.

9
Alex

Cela peut aider quelqu'un (j'ai passé quelques heures à comprendre cela). Après avoir apporté les modifications dans les fichiers source et avant de le tester, fermez votre navigateur pour détruire correctement PHPSESSIONID dans tous les domaines et sous-domaines.

J'espère que cela vous fera gagner du temps!

2
Luciano Camilo

J'avais un problème pour installer des cookies sur wordpress et cela m'a aidé, la valeur du domaine était la clé pour le faire fonctionner dans toutes les pages

$domain = ($_SERVER['HTTP_Host'] != 'localhost') ? $_SERVER['HTTP_Host'] : false;

setcookie("cookie_name", 'cookie_value', 0, '/', $domain);
0
Gendrith