php多域中的会话变量如何?

时间:2014-09-21 15:59:23

标签: php session

我有一个专门的服务器,有3个网站:

www /

www / site1(www.site1.com)

www / site2(www.site2.com)

www / site3(www.site3.com)

我是因为如果在site1,site2网站或3上创建会话,则会使其他两个会话可用,例如在身份验证环境中。

Site1:=>会员1 =>记录好,创建会话ID

<?php 
$ _SESSION ['Id'] = $user-> id; 
echo $ _SESSION ['id']; // Returns 1 
?>

我需要定期。&gt;

在site2和网站3上。

3 个答案:

答案 0 :(得分:2)

两个站点之间需要匹配两件事情才能从两个站点访问同一会话:

  1. 会话的存储方式和位置。
  2. 标识该特定会话的会话ID。
  3. 对于(1),如果您使用的是基于标准文件的会话存储,则只需将所有站点指向磁盘上的同一目录以存储会话,方法是将the session.save_path setting设置为相同的值

    对于(2),您需要在一个站点上传递session_id()的输出,并在下一个站点上使用相同的函数进行设置。最简单的方法是在查询字符串上创建一个包含会话ID的链接,例如: 'http://site2.example.com/?passed_session_id=' . session_id()

    但是,要注意安全隐患。有两种不同类型的攻击会使您的应用程序容易受到攻击:

    • 会话劫持:任何可以拦截该查询字符串的人都可以转到该URL并将会话声明为自己的会话,从而成为其会话的用户。
    • 会话固定:更巧妙的是,如果攻击者可以欺骗用户转到查询字符串上带有假会话ID的URL,他们可以选择用户的会话ID预先。同样,他们可以通过设置具有已知会话ID的cookie来成为该用户。

    你可以通过一些反措施来抵御这种攻击:

    • 仅在特定情况下传递查询字符串上的会话ID。如果可能,请仅在安全页面上执行此操作,以最大限度地减少URL被截获的可能性。但是,它仍将显示在浏览器历史记录中。例如。
    • 每当用户登录或注销时使用session_regenerate_id()更改会话ID,或以其他方式更改权限级别。这减少了固定攻击的范围,因为一旦用户登录,攻击者的会话将变为无效。
    • 如果可能,请在每次切换到其他站点时更改会话ID(即每次从查询字符串读取会话ID时)。这有一个缺点,即限制会话从一个站点移动到另一个站点,或者在特定时刻进行复制,而不是真正共享。
    • 包括&#34; nonce&#34;在经过时会话。这是一个字符串,您保存到会话并传递查询字符串,然后在使用后删除,或者如果它变得太旧。例如$_SESSION['session_passing'] = array('nonce' => uniqid(), 'time_limit' => strtotime('+2 minutes')); $url = 'http://site2.example.com/?passed_session_id=' . session_id() . '&nonce=' . $_SESSION['session_passing']['nonce'];如果,当从查询字符串中读取会话ID时,nonce与会话中的内容不匹配,或者时间限制已经过去,则不允许访问该会话(仅创建一个新的空会话,好像用户之前没有访问过该站点。)当nonce 匹配时,将其从会话中删除,以便加载相同的URL不再有效。
    • 在会话首次启动时在会话中存储其他标识信息,例如远程IP和用户代理,并检查它是否与所有后续页面加载相匹配。这意味着攻击者必须知道的不仅仅是会话ID才能接管会话。

    一个完全强大的实现是棘手的,但上述反措施的某些组合应该使你不那么容易成为目标。

答案 1 :(得分:1)

我立刻找到了解决方案! 如果user_id会话存在,我检查网站的索引,是否已连接,如果它不存在就可以,所以我重定向到主站点。 如果会话是我通过此URL密钥用户并连接该成员关于此密钥(加密)。但如果没有找到,我只是重定向到用户所需的网站! :) 像馅饼一样容易(法语术语^^)和功能! 谢谢您的回答!

如果你想问我代码。

答案 2 :(得分:0)

1)您可以通过一些PHPSESSID查询字符串将会话ID发送到ajax中的站点n°2,但我不知道它是否能完成这项工作......

2)如果用户访问网站#2,考虑通过某些ajax或查询字符串推送该session_id,您的php将在/ tmp / session_id上反序列化该session_id

然后如果系统不会在两个不同的主机上处理相同的session_id,则会创建一个新会话,如果您想要处理稍后将通过网站#1存储的新信息并将其反序列化,则还将基本session_id存储到该新会话中。结束..