php - session_regenerate_id()后无法存储session数据;

标签 php session

我有一个网页,我想在用户登录时重新生成 session ID。我遇到的问题是运行 session_regenerate_id(); 然后尝试附加 $_SESSION ['user'] = $row; 其中 $row 是一个数组。

我已经尝试了书中的所有方法,例如销毁 session 然后重新开始。我已经为此工作了至少 2 个小时,但我没有解决方案。

我已经删除了很多不相关的 php 并留下了一些,这样您就可以了解我正在尝试做的事情的要点,但这是脚本

<?php
    session_start();
    if(!isset($_SESSION["CSRF"])){
        $_SESSION["CSRF"] = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
    }
    if(!empty($_POST)){
        if($_POST["action"]==="login"){
            //querying DB for $_POST values
            $stmt = $db->prepare($query); 
            $result = $stmt->execute($query_params); 
            $login_ok = false;          
            $row = $stmt->fetch(); 
            if($row){ 
                $checked = //check password is okay
                if ($checked) {
                    $login_ok = true; 
                }
            }
            if($login_ok) { 
                session_regenerate_id();                
                unset($row['salt']); 
                unset($row['password']); 
                $_SESSION['user'] = $row;
            }
        }
    }       

我也试过没有运气。

<?php
    session_start();
    if(!isset($_SESSION["CSRF"])){
        $_SESSION["CSRF"] = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
    }
    if(!empty($_POST)){
        if($_POST["action"]==="login"){

            //querying DB for $_POST values
            $stmt = $db->prepare($query); 
            $result = $stmt->execute($query_params); 
            $login_ok = false;          
            $row = $stmt->fetch(); 
            if($row){ 
                $checked = //check password is okay
                if ($checked) {
                    $login_ok = true; 
                }
            }
            if($login_ok) {                 
                unset($row['salt']); 
                unset($row['password']); 
                $_SESSION['user'] = $row;
                $arr = $_SESSION;               
                session_regenerate_id(true);
                $_SESSION = $arr;
            }
        }
    }   

编辑

抱歉,我没有阐明标题,但基本上我会尝试将当前 session 存储在一个变量中,我将重新生成 session ID 并添加尝试将存储的 session 变量添加到新 session 中,但是 session ID 确实如此不包含旧数据,我没有收到任何错误。

最佳答案

我曾经遇到过同样的问题,但这真的只是瞎猜,因为这是一个非常特殊的案例。

我有两个域,www.domain.comsecure.domain.com。当我访问 www.domain.com 时,它设置了一个 cookie,但是在 cookie params 中我将域设置为 .domain.com,这意味着它用于 domain.com 和所有子域。

然后在 secure.domain.com 上,我也使用了 session cookie,但是 cookie 中使用的域是 secure.domain.com(即它只适用于 secure 子域)。为了检查用户是否登录,我按照 if (isset($_SESSION['username'])) 的方式做了一些事情来检查它是否在 session 中设置,但是由于域。 com 没有在它的 session 中使用数组键 username,它在没有那个的情况下接收 session cookie domain.com。然后,当我登录时,我会设置 username 并且一切正常,直到我重新生成 session ID。一旦我这样做,用户立即再次注销。我真的花了很长时间才弄清楚发生了什么,但基本上我在浏览器上留下了 两个 session cookie,一个被发送到 .domain.com另一个发送到 secure.domain.com,它们相互冲突。

这可以通过两种方式解决:

  1. 使来自主域的 cookie 仅用于 www 子域而不是所有子域。
  2. 使用不同的 session_name()对于其中一个域。这就是我所做的。

关于php - session_regenerate_id()后无法存储session数据;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21947786/

相关文章:

javascript - 如何用 typeahead.js 显示图片?

php - 我怎样才能消除这个脚本中对 die() 的使用,以便底部的 HTML 仍然运行?

php - 如何终止 PHP session ?

ios - QuickBlox IOS session 过期续订

php - 数组在 PHP session 中不完整

php - 当 URL 中包含 “” 时,为什么通过 URL 从 MySQL 获取数据不起作用?

PHP:尝试使用 "\n"创建一个新行

PHP Date - 如何添加一个字符串来分隔日期和时间

php - 如何使用 XMLHttpRequest 传递 php session

c# - ASP.Net Session 数据在页面之间丢失