gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:00:06 25 4
gpt4 key购买 nike

我有一个网页,我想在用户登录时重新生成 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com