我有一个网页,我想在用户登录时重新生成 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.com 和 secure.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
,它们相互冲突。
这可以通过两种方式解决:
- 使来自主域的 cookie 仅用于
www
子域而不是所有子域。 - 使用不同的
session_name()
对于其中一个域。这就是我所做的。
关于php - session_regenerate_id()后无法存储session数据;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21947786/