PHP session 重新生成安全性

标签 php security session

我在使用 PHP 做一些非常基本的 session 安全类型的事情时遇到了困难:

  • 从未验证的上下文切换到已验证的上下文时,应生成新的 session ID
  • 从经过身份验证的上下文切换到未经过身份验证的上下文时,应生成一个新的 session ID

我想做的不仅是在切换上下文时重新生成 session ID,而且在切换这些上下文时立即将某些内容(例如 FLASH)放入 session 中。希望这三页能阐明我的期望:

<?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 出现。如果我还没有 session 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 使现有 session 无效。此外,我在(大概) session 中放了一些东西 - 可能就像一个 FLASH - 说“你已经成功注销。

#page3.php
<html>
<body>
<?php session_start(); ?>
<?php print_r($_SESSION); ?>
</body>
</html>

在此页面上,我预计会发生两件事:

  • 来自 page2.php 的重定向应该向我发送了一个新的 session ID cookie(它没有)
  • 我希望 print_r 打印来自 INFO2 的信息,不会来自 INFO1。它没有来自 INFO1 的信息,但不包含来自 INFO2 的信息。

session_regenerate_id 和重定向的结果非常非常不一致。手动发送 Set-Cookie header 似乎很麻烦 - 但即使我没有发送,session_regenerate_id(TRUE) 无论如何也应该使旧 session ID 无效 - 所以即使浏览器由于某种原因没有获得新的 session ID,它也看不到 session 中的任何信息,因为旧 session 已失效。

有其他人遇到过此类问题吗?有解决这些问题的好方法吗?

最佳答案

基于documentation对于 session_regenerate_id,听起来 session 的内容 总是被保留。您向它传递了一个 TRUE 参数,但这只会删除磁盘上的实际 session 文件;存储在其中的值保存在 $_SESSION 中,然后写入新 session 。

所以也许手动清除它:

$_SESSION = array();

但不确定为什么您没有看到新的 cookie。你在哪里检查,你看到了什么?

编辑:正如 OP 在下面的评论中所揭示的那样,问题似乎是 page2 从未调用 session_start 来加载第一个 session 。产生以下内容:

<?php
    session_start();    # Load the old session
    session_destroy();  # Nuke it
    session_unset();    # Delete its contents
    session_start();    # Create a new session
    session_regenerate_id(TRUE);  # Ensure it has a new id
    $_SESSION['FLASH'] = "You've been logged out";
    session_write_close();  # Convince it to write
    header('Location: index.php');
?>

我不知道这是否是最小的。弄清楚其中有多少可以删除留给读者作为练习。

关于PHP session 重新生成安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14329685/

相关文章:

连接多个用户的 R Shiny session

java - Apache MINA 服务器和 PHP 客户端

php - 从标题中读取字符串后,字符串为空

security - 在 SQL 2008 Server 中创建自定义 SQL Server 角色

javascript - 限制 npm 依赖模块对 require(隔离)的使用

php - 访客柜台

session - 使用 Tomcat 领域时获取用户详细信息

在成员变量中使用命名空间的 PHP 静态方法调用

PHP 谷歌云存储

Python对象封装安全