【发布时间】:2012-12-29 01:50:01
【问题描述】:
我在使用 PHP 做一些非常基本的会话安全类型的事情时遇到了困难:
- 从未验证的上下文切换到已验证的上下文时,应生成新的会话 ID
- 从经过身份验证的上下文切换到未经过身份验证的上下文时,应生成新的会话 ID
我想做的不仅是在切换上下文时重新生成会话 ID,而且在切换这些上下文时立即将某些内容(例如 FLASH)放入会话中。这三页应该有望阐明我的期望:
<?php
/* page1.php */
session_start();
# Just putting something in the session which I expect to
# not show up later
$_SESSION['INFO1'] = 'INFO1';
?>
<html>
<a href="page2.php">Page 2</a>
<?php print_r($_SESSION) ?>
</html>
因此,当显示此页面时,我希望看到 INFO1 出现。我也希望当我回到这里时不会看到INFO2 出现。如果我还没有会话 ID,我希望得到一个(我有)。
<?php
# page2.php
session_destroy();
session_regenerate_id(TRUE);
$_SESSION['INFO2'] = 'From page 2';
session_write_close();
header('Location: page3.php');
exit;
?>
这最类似于注销功能——我们通过将TRUE 传递给session_regenerate_id 使现有会话无效。另外,我在(大概)new 会话中放了一些东西 - 这可能就像一个 FLASH - 说“你已成功注销。
#page3.php
<html>
<body>
<?php session_start(); ?>
<?php print_r($_SESSION); ?>
</body>
</html>
在此页面上,我预计会发生两件事:
- 来自
page2.php的重定向应该向我发送了一个新的会话 ID cookie(它没有) - 我希望
print_r打印来自INFO2的信息,而不是来自INFO1的信息。它没有来自INFO1的信息,但不包含来自INFO2的信息。
session_regenerate_id 和重定向的结果非常非常不一致。手动发送 Set-Cookie 标头似乎很麻烦——但即使我没有,session_regenerate_id(TRUE) 无论如何也应该使旧会话 ID 无效——所以即使浏览器由于某种原因没有获得新的会话 ID ,它不会在会话中看到任何信息,因为旧会话已失效。
还有其他人遇到过这类问题吗?有没有解决这些问题的好方法?
【问题讨论】: