2009-08-27 13 views
6

Je construis un site qui permet à un utilisateur de pointer un enregistrement CNAME sur mon site pour exécuter ses "profils", cela permet à votre nom de domaine OWN de charger votre profil sur mon site.Cross domain PHP Sessions

Cela soulève toutes sortes de problèmes liés aux sessions. J'ai vu virb le faire. Je ne vois aucune information basée sur une session dans un iFrame ... mais il y a un iFrame présent sur la page.

Je peux obtenir les choses de domaine au travail, je perds juste des données de session ... Des idées?

(Voici un exemple --links à Virb-- http://www.agentspider.com/)

+0

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

+1

Pas à travers les sous-domaines. Je parle de pointer un CNAME d'un autre domaine vers mon domaine et de garder la session. –

Répondre

4

La seule façon est d'ajouter la session id-s à l'URL-s qui vont d'un domaine à un autre (ou ajouter que l'identifiant de session à l'url src iframe), puis codez votre backend de stockage de session pour gérer cela.

Bien sûr, vous devez prendre en compte tous les problèmes de sécurité que cette approche apporte.

+0

c'est des travaux? et quels sont les problèmes de sécurité? –

0

Je ne suis pas certain de comprendre votre problème. Est-ce quelque chose comme un autre domaine appelant quelque chose comme www.userprofiles.com/profile.php?userid=1 et affichant les résultats? Dans ce cas, profile.php génère un nouvel identifiant de session chaque fois qu'il est appelé. Vous devez définir différentes ids pour chaque domaine externe à l'aide de votre site et changer profile.php à quelque chose comme:

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

session_start();

et appeler le script comme celui-ci www.userprofiles.com/profile.php?userid=1 & sid = somesessionid1234

5

Vous ne pouvez pas définir interdomaine cookies par défaut. Je crois que vous pouvez configurer un (des) fichier (s) P3P pour l'activer. http://p3ptoolbox.org/guide/section4.shtml#IVd Je ne l'ai pas fait moi-même, donc je ne sais pas combien des navigateurs l'implémentent ou si ça marche même de cette façon.

Virb ressemble à du JavaScript. Il a une bibliothèque AJAX qui envoie une requête JSON-P au serveur virb si aucun cookie de session n'est défini. (première charge de Firefox que vous pouvez voir dans Firebug) La réponse JSON indique à la page si l'utilisateur est connecté ou non et met à jour les parties de la page qui doivent refléter le statut de l'utilisateur.

Alors que se passe-t-il que la page incorpore certains JS de virb.com. Depuis le domaine est virb.com, les cookies mis à virb.com sont envoyés au serveur. Le serveur répond alors avec le résultat du cookie au site externe.

Dans le cas de virb, qui ne fonctionnera pas correctement sans JS, je pense que c'est une bonne option. Cependant, vous pouvez faire la même chose avec les redirections HTTP.

Si l'hôte HTTP est pas le domaine principal (example.com):

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

Sur le site principal, définissez le cookie, et envoyer l'utilisateur vers le domaine externe (domain.com) en passant l'identifiant de la session dans l'emplacement.

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

Le dernier bit est de rediriger vers la page que vous maintenant que vous avez la même session en cours.

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

Note, en réalité, vous pouvez envoyer la page que vous êtes actuellement sur le dos à example.com dans la première étape, de sorte que vous pouvez rediriger revenir plus tard. Comme vous n'utilisez que des en-têtes (vous n'avez pas besoin de sortir du contenu) et dans la plupart des cas HTTP/1.1, vous serez sur le même socket TCP. Je pense que c'est plutôt efficace et plus supporté. Option JavaScript Edit: n'oubliez pas de définir le cookie lorsque vous revenez au domaine externe.

La dernière étape est facultative mais elle empêche le sessid d'être dans une URL. Ce qui est plus un problème de sécurité que le garder dans les en-têtes HTTP.

+0

Serait-il possible de montrer un exemple de la solution JS? J'essaie de le faire, mais je ne comprends pas vraiment le processus. –

1

Rien de plus simple:

1) créer domain1.com/client.html avec source:

<script type="text/javascript" src="domain2.com/server_set_cookie.php"></script> 2) créer domain2.com/server_set_cookie.php avec une source 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/