【问题标题】:Deleted session variables after session_regenerate_id()在 session_regenerate_id() 之后删除了会话变量
【发布时间】:2014-02-05 22:02:47
【问题描述】:

我正在努力了解 PHP 会话。

我使用 ShortPHP 作为路由器,但 ShortPHP 代码不涉及会话。

模板有session_start()作为第一行:-

<?php 
session_start();
include 's.php';
var_dump($_SESSION);
$sid = session_id();
echo $sid;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>

首先为每个页面执行此模板(我添加了前几行(var_dump 等)以进行调试),然后是特定的页面代码。在这种情况下,我使用以下代码:-

<?php
if (!defined('S')) die ("You've got no S"); // part of ShortPHP - irrelevant

if (!isset($_SESSION['login']) || $_SESSION['login'] != "1") {
        echo "<p>Session is NOT set</p>";
        //header() redirect to login here...
        //exit();
}

$sri = session_regenerate_id();
var_dump($sri);

 ?>

如果我注释掉session_regenerate_id(),那么会话变量(login)在重新加载页面后仍然可用,但启用session_regenerate_id() 后,当我重新加载页面时会话变量将被删除。请注意,session_regenerate_id() 每次都会返回 true

我什至已经读取了存储在服务器上的会话,并且原始会话的文件中包含会话变量数据,而在重新加载页面后,新会话文件没有变量(文件大小为零)。

我在这里做错了吗?

【问题讨论】:

  • 在重置 ID 之前是否有任何输出到浏览器,session_regenerate_id() 返回什么?
  • 用您的问题的答案编辑了问题:是的和正确的
  • 奇怪。如果您在发送标头(输出发送到浏览器)之前使用session_regenerate_id(),是否会有所不同?
  • @jeroen:我已将session_regenerate_id() 放在模板的第三行(在session_start() 之后),但没有帮助。登录后它仍然显示会话变量,当我刷新页面时它是空的。
  • 对不起,这对我来说是个谜,它应该可以工作......

标签: php session


【解决方案1】:

原因是 session.cookie_secure 在未使用 https 时设置为 php.ini。删除该设置后,会话将在页面刷新之间持续。

【讨论】:

    【解决方案2】:

    通常最好将true 作为参数传递给session_regenerate_id();,因为这将删除旧的会话数据。

    【讨论】:

    • 整个想法是避免删除旧的会话数据 - 我希望它会被传递给新的会话 ID。
    • 应该是,传递 true 会删除仍然存在的旧会话,这会引起安全问题。以前的数据应该可以通过新的会话 ID 获得。
    • 在分析和跟踪攻击之前删除旧会话数据通常不是一个好主意。所以最好不要将true 传递给 session_regenerate_id() 除非你不关心攻击者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2014-09-13
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2015-07-09
    相关资源
    最近更新 更多