您可以做的是在站点之间创建“交叉”链接以继续会话。
最简单的方法是通过查询字符串传递会话 ID;例如
http://whateverblammo.com/?sessid=XXYYZZ
在您开始认为任何人都可以捕获该信息之前,请考虑一下您的 cookie 是如何传输的;假设您没有使用 SSL,那么对于窃听网络的人来说没有太大区别。
这并不意味着它是安全的;其一,用户可能会意外地复制/粘贴地址栏,从而泄露他们的会话。为了限制这种暴露,您可以在收到会话 ID 后立即重定向到没有会话 ID 的页面。
请注意,使用mcrypt()
在会话 id 上没有多大帮助,因为问题不是值的可见性;会话劫持不关心底层值,只关心 url 的可重复性。
你必须确保该id只能使用一次;这可以通过创建一个跟踪使用计数的会话变量来完成:
$_SESSION['extids'] = array();
$ext = md5(uniqid(mt_rand(), true)); // just a semi random diddy
$_SESSION['extids'][$ext] = 1;
$link = 'http://othersite/?' . http_build_query('sessid' => session_id() . '-' . $ext);
收到时:
list($sid, $ext) = explode('-', $_GET['sessid']);
session_id($sid);
session_start();
if (isset($_SESSION['extids'][$ext])) {
// okay, make sure it can't be used again
unset($_SESSION['extids'][$ext]);
}
你需要这些链接每次跨越了边界,因为自上次以来会话可能已重新生成。