2008-12-07 24 views
26

Estoy trabajando en un sitio con múltiples subdominios, algunos de los cuales deberían tener su propia sesión.PHP: Control de dominio/subdominio de cookies

Creo que lo he solucionado, pero he notado algo sobre el manejo de cookies que no entiendo. No veo nada en los documentos que lo explique, así que pensé que vería si alguien aquí tiene algo que ver con la pregunta.

Si acabo de hacer:

session_start(); 

termino con una cookie de sesión como esto:

subdomain.example.net

Sin embargo, si hago cualquier intento de establecer la cookie dominio de mí mismo, ya sea como

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

o como

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

termino con una galleta para .subdomain.example.net (tenga en cuenta el punto de apertura), que creo que significa "coincide con todos los subdominios (o en este caso sub-subdominios).

Esto parece suceder con todas mis cookies en realidad, no solo la sesión. Si configuro el dominio de cookies yo mismo, automáticamente tiene el punto antepuesto, es decir, este dominio y todos sus subs. Si no configuro el dominio, lo hace bien utilizando solo el dominio actual.

¿Alguna idea de lo que hace esto y qué puedo hacer para controlar ese punto anterior?

Gracias!

+0

No tiene que controlar el punto inicial porque es * ignorado * por el navegador, según RFC 6265, que es lo que implementan todos los navegadores modernos. Entonces, no piensen en el punto inicial. Aparte de eso, establezca explícitamente el dominio de la cookie o configúrelo en una cadena vacía para limitarlo al host de la solicitud actual. La biblioteca https://github.com/delight-im/PHP-Cookie tiene algunos controles convenientes para eso. – caw

Respuesta

24

Las funciones de cookies de PHP automáticamente preceden $ dominio con un punto. Si no desea este comportamiento, puede usar la función header. Por ejemplo:

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

Si lee todo el RFC 6265, se dará cuenta de que la única forma adecuada de tener una cookie "solo de host" es NO establecer el atributo de dominio. http://tools.ietf.org/html/rfc6265#section-5.4 – stolsvik

+1

"la única forma correcta de tener una cookie" solo de host "es NO establecer el atributo de dominio" No es específico de PHP, pero esto me ayudó a resolver un problema cuando estábamos cambiando de HOST only cookies a x-subdomain cookies y estaba tratando de eliminar la cookie del host solo en javascript especificando el dominio completo, y JavaScript anteponía un punto que causaba el dominio de la cookie existente no hacer coincidir, y como resultado no ser eliminado. –

16

Si ejecuta el script PHP bajo "http://subdomain.example.net", no utilizan el parámetro de dominio:

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

Usted recibirá una cookie con "subdomain.example.net "(y no" .subdomain.example.net ")

+0

¿Cuál es la diferencia entre un dominio explícito establecido en subdominio.example.net y uno que no está configurado? – Pacerier

+0

si lo configura, obtiene un punto al frente que coincide con todos los subdominios, en lugar de solo hacer coincidir el subdominio actual solo – troseman

2

Esto puede ayudar a alguien (pasé algunas horas para resolver esto). Después de realizar los cambios en los archivos fuente y antes de probarlos, cierre su navegador para destruir PHPSESSIONID correctamente en todos los dominios y subdominios.

Espero que esto ahorre tiempo!

+1

También puede usar la parte de sesión de Firebug si desea administrar las cookies de sesión explícitamente. – Eli

+2

Para mí, la nueva ventana anónima funciona muy bien para las pruebas. –

7

Comprendo que esto es una vieja pregunta, pero yo estaba teniendo este problema y ninguna de las respuestas por encima de todo lo hizo.

Quería establecer la cookie de sesión para un subdominio, pero también habilitar httponly y seguro.

Para evitar una ventaja. Delante del subdominio, Kevin y stolsvik son correctos, no establezca el atributo del dominio.

Así que para hacer esto y ser capaz de establecer httponly y el modo seguro todavía, establecer el dominio en NULL de la siguiente manera:

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

que ahora tendrá una cookie de sesión, para un subdominio específico (sin líder .) con httponly y seguro establecido en verdadero.