跨域共享PHP会话

7
我在SOF上看过几个关于此问题的回答,但大多数都涉及子域名的使用,其中没有一个对我有效。常见的一个是使用session.cookie_domain,但据我所知,这只适用于子域名。
我想找到一个解决方案,可以处理完全不同的域(包括子域名)。不幸的是,由于项目期限,时间不允许我自己研究,因此我求助于SOF的专业技术和经验。
当前项目要求能够登录一个网站,该网站目前仅将user_id存储在会话中,然后能够在同一服务器环境内的不同域中检索此值。会话数据存储/检索自数据库,其中session id是主键。
我希望找到一个“轻量级”且“易于实现”的解决方案。
系统采用内部模型视图控制器设计模式,因此所有请求(包括不同的域)都通过单个引导脚本运行。使用域名作为变量,确定要向用户显示的上下文。
一个看起来有潜力的选项是使用隐藏的图像,并使用alt标签设置user id。我的第一印象表明,如果可能的话,这似乎立即变得“太容易”了,并且存在安全漏洞。讨论一下?
我考虑的另一个选项是使用IP和用户代理进行身份验证,但由于共享网络和更改的IP地址,我认为这不是一个可靠的选择。
我考虑的第三个选项(也是首选)是使用htaccess来欺骗用户,使其认为他们正在访问不同的域,而实际上Apache正在重定向;类似于 www.foo.com/index.php?domain=bar.com&controller=news/categoires/1 但对用户显示为 www.bar.com/news/categories/1 foo.com表示“主站点域名”,所有请求都通过它运行,而bar.com是用户认为自己正在访问的网站。控制器请求决定所请求的页面和视图。这种方法可行吗?
还有其他选择吗?优缺点是什么?
提前感谢!!!

抱歉,我忘了提到,我目前正在本地运行系统(使用XAMPP)。我同时使用本地域名(编辑了主机文件)和由Fasthost托管的域名来转发到我的IP。只是想提一下,以防这会影响我的当前测试。 - bigstylee
3个回答

0

你有没有考虑使用session_set_save_handler。你可以将你的会话存储在数据库中,并从任何域访问它们。


1
我正在使用这个。问题在于PHP生成的session_id对于每个域名都是不同的。 - bigstylee
你不能通过会话ID识别用户吗?在表中使用不同的列。每个用户将有多行,但您可以将一行设置为相同的值。我以前从未做过这个,只是随便说说。 - Galen
1
foo.com给出了一个会话ID为ABC123,而bar.com给出的会话ID为QWERTY。除非我比较IP/UserAgent,否则我不知道ABC123和QWERTY是否指向同一用户。(就我所知)检索会话数据的数据库查询为SELECT * FROM sessions WHERE session_id="%string"。或者我没有理解你的意思? - bigstylee

0
  1. 定义一个主会话服务器(可以与memcached结合使用)

  2. 使用Ajax/JSON(P)从该服务器请求会话,这样可以在多个域之间共享会话

  3. 重复使用此会话


-3

为了让其他对此功能感兴趣的人受益,我很遗憾地告诉你们,没有简单的答案。请搜索“单点登录”,它会返回相关技术和一些可用的解决方案。

至于使用htaccess隐藏域名,这是不可能的,因为它可能被用于恶意活动。

我现在已经成功实现了满足我的要求的系统。


1
这不是一个答案。你没有告诉我们你做了什么。 - Jonathan Hall

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