2009-08-27 32 views
6

Estoy creando un sitio que permite a un usuario apuntar un registro CNAME en mi sitio para ejecutar sus "perfiles", esto permite que su PROPIO nombre de dominio cargue su perfil en mi sitio.Sesiones PHP de dominio cruzado

Esto plantea todo tipo de problemas relacionados con las sesiones. He visto a virb hacerlo. No veo ninguna información que esté basada en sesiones en un iFrame ... pero SI hay un iFrame presente en la página.

Puedo hacer que las cosas de dominio funcionen, solo pierdo datos de sesión ... ¿Alguna idea?

(Este es un ejemplo --Links a Virb-- http://www.agentspider.com/)

+0

duplicado de http://stackoverflow.com/questions/1064243/php-sessions-across-sub-domains/1064278 – Residuum

+1

No en todos los subdominios. Me refiero a señalar un CNAME desde otro dominio a mi dominio y aún mantener la sesión. –

Respuesta

4

La única forma es añadir sesión id-s a la url-s que van desde un dominio a otro (o añadir que id de sesión a iframe src url), y luego codifica el backend de almacenamiento de la sesión para manejar esto.

Por supuesto, debe tener en cuenta todos los problemas de seguridad que conlleva este enfoque.

+0

esto es trabajos? y que problemas de seguridad? –

0

no estoy seguro Entiendo su problema. ¿Es algo así como otro dominio llamando a algo como www.userprofiles.com/profile.php?userid=1 y mostrando los resultados? En este caso profile.php generará una nueva identificación de sesión cada vez que se llame. Es necesario ajustar diferentes ID para cada dominio externo a través de su sitio y cambiar profile.php a algo como:

if (isset ($ _ REQUEST [ 'sid'])) session_id ($ _ REQUEST [sid]);

session_start();

y llamar al script como el www.userprofiles.com/profile.php?userid=1 & sid = somesessionid1234

5

No se puede establecer cookies dominios de forma predeterminada. Creo que puede configurar un archivo P3P para habilitarlo. http://p3ptoolbox.org/guide/section4.shtml#IVd No lo he hecho yo mismo, así que no sé cuánto lo implementan los navegadores o si incluso funciona de esa manera.

Parece que Virb está utilizando JavaScript. Tiene una biblioteca AJAX, que realiza una solicitud JSON-P al servidor virb si no se establece ninguna cookie de sesión. (La primera carga de Firefox puede ver esto en Firebug) La respuesta JSON solo le permite a la página saber si el usuario está conectado o no, y actualiza las partes de la página que necesitan reflejar el estado del usuario.

Entonces, ¿qué ocurre? La página incorpora algunos JS de virb.com. Como el dominio es virb.com, las cookies configuradas en virb.com se envían al servidor. El servidor responde con el resultado de la cookie al sitio externo.

En el caso de virb, que no funcionará correctamente sin JS, creo que es una buena opción. Sin embargo, podría hacer lo mismo con los redireccionamientos HTTP.

Si el host HTTP no es el dominio principal (example.com):

if (!$_COOKIE['sessionid'] && $_SERVER['HTTP_HOST'] != 'example.com') { 
// redirect to your main site 
header('Location: http://example.com'); 
} 

En el sitio principal, establezca la cookie, y enviar al usuario de vuelta al dominio externo (domain.com) que pasa la identificación de la sesión en la Ubicación.

header('Location: http://domain.com.com?sessid='.urlencode($_COOKIE['sessionid'])); 

El bit final es volver a dirigir de nuevo a la página que estabas en que ahora que tiene la misma sesión en marcha.

setCookie(...); // sessid in $_GET['sessid'] 
header('Location: http://domain.com/'); 

Tenga en cuenta, en la actualidad se puede enviar la página que está actualmente en la parte posterior de example.com en el primer paso, por lo que puede volver a dirigir de nuevo a él más tarde.

Dado que solo está usando encabezados (no es necesario que genere contenido) y en la mayoría de los casos HTTP/1.1, estará en el mismo socket TCP, creo que es bastante eficiente y será más compatible que el Opción JavaScript

Editar: no olvide configurar la cookie cuando regrese al dominio externo.

El último paso es opcional pero evita que el sessid se encuentre en una URL. Lo cual es más un problema de seguridad que mantenerlo en encabezados HTTP.

+0

¿Sería posible mostrar un ejemplo de la solución JS? Estoy tratando de hacerlo, pero realmente no entiendo el proceso. –

1

Nada más simple como:

1) crear domain1.com/client.html con fuente:

<script type="text/javascript" src="domain2.com/server_set_cookie.php"></script> 2) crear domain2.com/server_set_cookie.php con fuente de php:

header("p3p: CP=ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"); 

setcookie($_REQUEST['cookie_name'], 'cookie_name', time()+3600); 

http://smartcoding.wordpress.com/2009/07/12/setcookie-cross-domain-cookie-write/