跨域PHP会话

跨域PHP会话,php,session,cross-domain,Php,Session,Cross Domain,我正在建立一个网站,允许用户在我的网站点CNAME记录运行他们的“配置文件”,这允许您自己的域名加载到我的网站上您的配置文件 这引发了与会议相关的各种问题。我见过virb这样做。我没有在iFrame中看到任何基于会话的信息。。。但是页面上有一个iFrame 我可以让域的东西工作,我只是丢失会话数据。。。有什么想法吗 (这里是一个示例--指向Virb的链接--)唯一的方法是将会话id添加到从一个域到另一个域的url-s(或将该会话id添加到iframe src url),然后对会话存储后端进行编码

我正在建立一个网站,允许用户在我的网站点CNAME记录运行他们的“配置文件”,这允许您自己的域名加载到我的网站上您的配置文件

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

我可以让域的东西工作,我只是丢失会话数据。。。有什么想法吗


(这里是一个示例--指向Virb的链接--)

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


当然,你需要考虑这个方法带来的所有安全问题。 我不太明白你的问题。 它是否类似于另一个域调用www.userprofiles.com/profile.php?userid=1并显示结果? 在本例中,只要调用profile.php,它就会生成一个新的会话id。 您需要使用您的站点为每个外部域设置不同的ID,并将profile.php更改为:

如果(isset($_请求['sid'])) 会话id($_请求['sid'])

会话_start()

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

默认情况下,不能跨域设置cookies。我相信,您可以设置一个P3P文件来启用它。 我自己并没有这样做,所以我不知道有多少浏览器实现了它,或者它是否可以这样工作

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

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

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

如果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,以便稍后重定向回example.com

由于您只使用头文件(不需要输出内容),并且在大多数情况下使用HTTP/1.1,因此您将使用相同的TCP套接字,我认为这非常有效,并且比JavaScript选项更受支持

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


最后一步是可选的,但它可以防止sessid出现在URL中。这是一个更大的安全问题,然后保持在HTTP头

没有比这更简单的了:

1) 使用以下来源创建domain1.com/client.html:


2) 使用php源代码创建domain2.com/server\u set\u cookie.php:

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

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

不跨子域复制。我说的是将一个CNAME从另一个域指向我的域,并且仍然保持会话。可以展示一个JS解决方案的示例吗?我正试图这么做,但我并不真正理解这个过程。
header("p3p: CP=ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV");

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