2009-09-02 16 views
1

Je travaille localement sur deux "domaines". J'ai des hôtes virtuels enterprise.local et application.local sur ma machine et j'ai besoin de configurer un cookie de domaine pour "local" ou ".local". Cependant, j'ai de la difficulté à configurer correctement le cookie. En application.local, j'ai ceci:Problème Réglage Cookie w/PHP

setcookie('iPlanetDirectoryPro', trim($token_id), '0', '/', '.local'); 
header('Location: /adcom-sso'); 

J'ai aussi essayé ceci:

header('Set-Cookie: iPlanetDirectoryPro=' . trim($token_id) . '; path=/'); 
header('Location: /adcom-sso'); 

En utilisant setcookie(), aucun cookie est toujours défini. En utilisant l'en-tête Set-Cookie, le cookie est. J'ai enlevé la redirection des deux et le résultat ne change jamais. Cela fonctionne pour Set-Cookie, mais pas pour setcookie(). Ce serait bien que je n'ai pas vraiment une préférence quelle solution je l'utilise, mais dans la solution Set-Cookie, dès que j'ajouter un domaine tout se détraque:

header('Set-Cookie: iPlanetDirectoryPro=' . trim($token_id) . '; path=/; domain=local'); 

Dès que j'ajouter dans la valeur de domaine, je reçois une erreur d'en-tête:

Header may not contain more than a single header, new line detected. 

J'ai essayé la valeur de domaine comme « local » et « .local ». Le comportement ne change pas.

J'ai rarement besoin d'accéder explicitement aux cookies, donc j'espère juste manquer quelque chose d'évident, mais je ne le vois certainement pas. Toute opinion serait très appréciée.

MISE À JOUR: Je pense que je l'ai rétréci un peu plus loin. Il semble que les deux façons fonctionneront tant que je n'inclut pas une valeur de domaine. Pourrait-il y avoir un problème avec l'utilisation de "local" ou ".local" en tant que domaine spécifique du cookie?

Répondre

2

EDIT: J'ai eu maintenant un coup d'œil à RFC2109, 4.3.2 Rejeter Cookies:

  • The value for the Domain attribute contains no embedded dots or does not start with a dot.

    ...

  • A Set-Cookie with Domain=.com or Domain=.com., will always be rejected, because there is no embedded dot.

Il semble que le navigateur rejette '.local' en raison de problèmes de sécurité. Pour définir un cookie pour un domaine, il doit comporter au moins deux points (par exemple, «.cookiedomain.local»).

La définition d'un cookie à partir d'un sous-domaine (par exemple un seul emplacement local) pour un autre sous-domaine (par exemple un autre local) n'est pas possible. AFAIK. Ce que vous pouvez faire pour résoudre ce problème consiste à rediriger l'utilisateur vers un domaine de cookies qui définit/obtient tous les cookies et redirige l'utilisateur à l'endroit d'où ils proviennent avec les données de cookie incluses dans l'url comme paramètres de requête. Microsoft le fait (ou l'a fait) pour ses propres domaines (msn.com, microsoft.com).


L'erreur que vous obtenez (« En-tête ne peut pas contenir ... ») ne se déclenche que si la chaîne que vous passez comme argument à header() contient un caractère de retour à la ligne ne soit pas suivi par un espace ou un onglet (qui continuerait l'en-tête sur la ligne suivante).

Maintenant, setcookie() va effectivement urlencode() sa valeur (setrawcookie() ne sera pas), donc un saut de ligne ne provoquera pas une erreur là. Par contre, la fonction trim() ne supprimera les espaces qu'à partir du début et de la fin de l'argument et laissera tous les autres caractères de saut de ligne intacts. Alors peut-être que vous pourriez essayer quelque chose comme preg_replace('/\s+/', '') à la place.

Pourquoi l'approche setcookie() ne fonctionne pas pour vous n'est pas immanquablement évident pour moi. Peut-être que vous voyez réellement le cookie (réglé avec setcookie()) mais ne vous attendez pas à une fuite d'URL, et le rejetez silencieusement quelque part dans votre code.

Cependant, cela n'explique pas pourquoi votre premier header() semble fonctionner (avec des sauts de ligne dans celui-ci); Il semble que certaines valeurs de vos cookies contiennent des sauts de ligne et d'autres non.

Définir le domaine à '.local' (mener '.') Est la bonne chose à faire, soit dit en passant, si vous voulez que les sous-domaines voient le cookie.

Certaines mises en garde supplémentaires sur la configuration des cookies avec setcookie() sont discutées dans la documentation PHP (en particulier les commentaires des utilisateurs).

+0

J'ai vraiment essayé tous ceux-là. À l'origine, je ne coupais pas du tout. J'ai aussi essayé setrawcookie(), même si je ne l'ai pas inclus ici pour des raisons de simplicité. Dans la solution Set-Cookie, j'ai aussi essayé manuellement urlencode() 'the $ token_id. J'ai juste essayé l'idée de preg_replace() et cela n'a rien changé. Merci. –

+0

"L'en-tête ne peut pas contenir ..." ne se déclenchera * pas * sauf si vous avez un saut de ligne. J'ai regardé le code source de PHP ('sapi_header_op()'). Vous avez certainement un problème de saut de ligne avec cette erreur. – Inshallah

+0

Ce que j'ai finalement trouvé correspond à votre édition. Dès que j'ai essayé ".local.com" tout s'est bien passé. Dans ce cas, le problème était dû à mon environnement de développement où je garde mes "domaines" simples. Il ne devrait jamais être un problème dans la pile vers les environnements de production. Merci de votre aide. –