跨域PHP会话

时间:2009-08-27 09:46:12

标签: php session cross-domain

我正在构建一个网站,允许用户在我的网站上指定CNAME记录来运行他们的“个人资料”,这样就可以让您的OWN域名在我的网站上加载您的个人资料。

这引发了与会话相关的各种问题。我见过virb做到了。我没有在iFrame中看到任何基于会话的信息......但页面上有一个iFrame。

我可以让域名内容工作,我只是丢失会话数据......有什么想法吗?

(这是一个例子 - 与Virb的链接 - http://www.agentspider.com/

4 个答案:

答案 0 :(得分:5)

默认情况下,您无法跨域设置Cookie。我相信,您可以设置一个P3P文件来启用它。 http://p3ptoolbox.org/guide/section4.shtml#IVd 我自己没有这样做,所以我不知道有多少浏览器实现它,或者它是否以这种方式工作。

Virb看起来只是使用JavaScript。它有一个AJAX库,如果没有设置会话cookie,它会向virb服务器发出JSON-P请求。 (首次加载Firefox,你可以在Firebug中看到这一点)JSON响应只是让页面知道用户是否登录,并更新页面中需要反映用户状态的部分。

所以正在发生的事情是该页面嵌入了来自virb.com的一些JS。由于域名是virb.com,因此将设置为virb.com的cookie发送到服务器。然后,服务器将cookie的结果响应到外部站点。

对于virb,如果没有JS,它将无法正常工作,我认为这是一个不错的选择。但是,您可以对HTTP重定向执行相同的操作。

如果HTTP主机不是主域(example.com):

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

在主站点上,设置cookie,并将用户发送回外部域(domain.com),在位置中传递会话ID。

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

最后一点是重定向回你现在进行同一会话的页面。

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

请注意,实际上您可以在第一步中将当前页面发送回example.com,以便稍后重定向到该页面。

由于你只是使用标题(你不需要输出内容),并且在大多数情况下是HTTP / 1.1所以你将在同一个TCP套接字上,我认为它非常高效,并且比JavaScript更受支持选项。

编辑:当您回到外部域时,不要忘记设置cookie。

最后一步是可选的,但它会使sessid不在URL中。这更像是一个安全问题,然后将其保存在HTTP标头中。

答案 1 :(得分:4)

唯一的方法是将会话ID -s添加到从一个域到另一个域的url-s(或将该会话ID添加到iframe src url),然后对会话存储后端进行编码以处理此问题。 / p>

当然,您需要考虑此方法带来的所有安全问题。

答案 2 :(得分:1)

没有比这更简单了:

1)使用source:

创建domain1.com/client.html

<script type="text/javascript" src="domain2.com/server_set_cookie.php"></script&GT; 2)使用php源创建domain2.com/server_set_cookie.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/

答案 3 :(得分:0)

不确定我理解你的问题。 它是否像是另一个域名,如www.userprofiles.com/profile.php?userid=1并显示结果? 在这种情况下,profile.php将在调用时生成新的会话ID。 您需要使用您的站点为每个外部域设置不同的ID,并将profile.php更改为:

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

在session_start();

并像这样调用脚本 www.userprofiles.com/profile.php?userid=1&sid=somesessionid1234