跨域PHP会话管理

6
我正在建立一个网站,允许用户将CNAME记录指向我的网站来运行他们的"个人资料",这样您自己的域名就可以加载您在我的网站上的个人资料。
这引发了与会话相关的各种问题。我看到Virb这样做了。我在iFrame中没有看到任何基于会话的信息...但页面上确实存在iFrame。
我可以使域名相关的内容正常工作,但我失去了会话数据...有什么想法吗?
(这里是一个示例--链接到Virb--http://www.agentspider.com/

重复https://dev59.com/r3NA5IYBdhLWcg3wKam3#1064278 - Residuum
1
我在谈论将另一个域名的CNAME指向我的域名,并仍然保持会话。 - undefined
4个回答

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结果。
在没有JS的情况下无法正常工作的Virb,我认为这是一个不错的选择。但是,您也可以使用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),在Location中传递会话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,因此我认为它非常高效,并且比JavaScript选项更受支持。
编辑:不要忘记在返回外部域时设置cookie。
最后一步是可选的,但它可以防止sessid出现在URL中。这比将其保留在HTTP标头中更具安全性。

能否展示一下JS解决方案的示例?我正在尝试做这件事,但我并不真正理解这个过程。 - undefined

4

唯一的方法是将会从一个域到另一个域的url中添加会话id(或将该会话id添加到iframe src url中),然后编写您的会话存储后端以处理此操作。

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


1

没有比这更简单的了:

1)创建带有源代码的domain1.com/client.html:

<script type="text/javascript" src="domain2.com/server_set_cookie.php"></script> 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/


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接