gpt4 book ai didi

mysql - session_regenerate_id 和数据库处理程序

转载 作者:可可西里 更新时间:2023-11-01 08:22:12 25 4
gpt4 key购买 nike

我正在为我的 session 使用数据库处理程序,它工作正常但现在我遇到了身份验证问题。

当用户使用用户名/密码登录时,我执行 session_regenerate_id,之后我尝试选择当前的 session_id。

这是我的代码

session_regenerate_id();
echo $checkQ=" SELECT * FROM my_sessions WHERE id='".session_id()."' ";
......

但我没有得到任何结果。 session_id 是正确的。

完成加载页面并将 SQL 命令复制粘贴到 phpMyAdmin 后,我得到了结果。

我知道这很愚蠢,但我能想到的唯一原因是 session_regenerate_id()“太慢”,所以当我尝试读取下一行的 session_id 时,session_id 尚未在数据库中创建。

谁能帮帮我!

最佳答案

我知道已经有一段时间了,我希望自发布以来您已经找到了答案,但为了后代的缘故,我会添加我的解决方案。

调用session_generate_id()会导致session_id()的值发生变化:

<?php
$before = session_id();
session_regenerate_id();
$after = session_id();
var_dump($before == $after); // outputs false

这个问题对我来说很明显,因为在 session 写入处理程序中我正在这样做(当然没有这样的伪造方法名称):

<?php
class MySQLHandler
{
function read($id)
{
$row = $this->doSelectSql($id);
if ($row) {
$this->foundSessionDuringRead = true;
}
// snip
}

function write($id, $data)
{
if ($this->foundSessionDuringRead) {
$this->doUpdateSql($id, $data);
}
else {
$this->doInsertSql($id, $data);
}
}
}

如果从未调用过 session_regenerate_id(),则 write() 方法可以正常工作。但是,如果它被调用,write() 的 $id 参数与传递给 read() 的 $id 不同,因此更新将找不到任何记录使用新的 $id 因为它们从未被插入过。

有些人建议使用 MySQL 的“REPLACE INTO”语法,但这会删除并替换该行,如果您想拥有一个创建日期列,这会造成严重破坏。我为解决这个问题所做的是保留传递给 read 的 session ID,然后在写入期间使用传递给 read 的 id 更新数据库中的 session ID > 作为关键:

<?php
class MySQLHandler
{
function read($id)
{
$row = $this->doSelectSql($id);
if ($row) {
$this->rowSessionId = $id;
}
// snip
}

function write($id, $data)
{
if ($this->rowSessionId) {
$stmt = $this->pdo->prepare("UPDATE session SET session_id=:id, data=:data WHERE session_id=:rowSessionId AND session_name=:sessionName");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':rowSessionId', $this->rowSessionId);
$stmt->bindValue(':data', $data);
$stmt->bindValue(':sessionName', $this->sessionName);
$stmt->execute();
}
else {
$this->doInsertSql($id, $data);
}
}
}

关于mysql - session_regenerate_id 和数据库处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4538647/

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