首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP会话再生安全性

PHP会话再生安全性
EN

Stack Overflow用户
提问于 2013-01-15 01:18:06
回答 1查看 5.1K关注 0票数 3

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

  • 当从未经身份验证的上下文切换到经过身份验证的上下文时,应生成新的会话ID。
  • 当从经过身份验证的上下文切换到未经身份验证的上下文时,应该生成新的会话ID。

我想要做的不仅是在切换上下文时重新生成会话ID,而且在切换这些上下文时立即将一些内容放入会话中(例如闪光灯)。希望这三页能澄清我的期望:

代码语言:javascript
复制
<?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,我希望得到一个(我有)。

代码语言:javascript
复制
<?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来使现有会话失效。另外,我在(大概)会话中添加了一些东西--这可能就像一个闪存--说“您已经成功地注销了”。

代码语言:javascript
复制
#page3.php
<html>
<body>
<?php session_start(); ?>
<?php print_r($_SESSION); ?>
</body>
</html>

在这个页面上,我希望会发生两件事:

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

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

有没有其他人在这些问题上有过经验?有什么好办法解决这些问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-15 01:26:24

基于文档 for session_regenerate_id,听起来会话的内容总是保持不变的。您将传递给它一个TRUE参数,但这只会删除磁盘上的实际会话文件;存储在其中的值保存在$_SESSION中,然后写入新会话。

因此,也许手动删除它:

代码语言:javascript
复制
$_SESSION = array();

不知道你为什么没看到新曲奇。你在哪里查的,你看到了什么?

编辑:正如OP在下面的评论中所揭示的,问题似乎是page2从未调用session_start来加载第一个会话。产生的结果如下:

代码语言:javascript
复制
<?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');
?>

我不知道这是不是最低限度。找出其中有多少可以删除,这是留给读者的练习。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14329685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档