我有一个网页,我想在用户登录时重新生成会话ID.我遇到的问题是我运行session_regenerate_id();然后尝试附加$_SESSION['user'] = $row;$ row是一个数组.
我已经尝试了书中的所有内容,例如销毁会话然后重新开始.我一直在研究它至少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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我也试过没有运气.
<?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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
对不起,我没有澄清标题,但基本上我会尝试将当前会话存储在变量中,我将重新生成会话ID并添加尝试将存储的会话变量添加到新会话中,但会话ID不包含旧数据,我没有收到任何错误.
您确定 $login_ok 设置为 true 吗?你可以在那里打印一些东西来确定。从我的测试(脚本的简化版本)来看,它似乎工作正常:
<?php
session_start();
$data = $_SESSION['data'];
$sid = session_id();
echo "Old data is $data<br>Sid is $sid<br>";
if($_GET["action"]==="login"){
session_regenerate_id();
$_SESSION['data'] = $data + 1;
}
$data = $_SESSION['data'];
$sid = session_id();
echo "New data is $data\n<br>Sid is $sid\n<br>";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1199 次 |
| 最近记录: |