- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在为我的 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/
我有一个奇怪的问题,在我使用 重新生成 session ID 之后 session_regenerate_id(true); cookie 似乎失去了它的“Secure, HttpOnly”标志。 我
我有一个网页,我想在用户登录时重新生成 session ID。我遇到的问题是运行 session_regenerate_id(); 然后尝试附加 $_SESSION ['user'] = $row;
我正在为我的 session 使用数据库处理程序,它工作正常但现在我遇到了身份验证问题。 当用户使用用户名/密码登录时,我执行 session_regenerate_id,之后我尝试选择当前的 ses
问候, 我正在开发一个登录系统,但遇到了黑莓浏览器身份验证问题。 PHP 的 session_regenerate_id() 似乎有问题,有人可以建议替代方案吗?以下是身份验证和登录脚本: 更新看起来
我正在我的网站上创建一个登录功能,我正在考虑在每个页面上重新生成 session ID 以提高安全性。 我已经阅读了 PHP:s 关于 regenerate_id 的信息,但是 PHP 页面上的帖子与
为什么以及何时应该在 php 中使用 session_regenerate_id() 函数?使用 session_start() 后是否应该一直使用它?我听说我必须使用它来防止 session 固定,
我正在研究我的网站的安全性,我会理解为什么应该谨慎使用 session_regenerate_id。 在 php 手册文档( https://www.php.net/manual/fr/functio
我正在从受 session 保护的页面执行标准的 getJSON 查询: $.getJSON('queries.php',{q: 'updateEvent', param1: p1}, fun
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Close session and start a new one 我使用 wampserver2.1 ph
医生说 session_create_id() 用于为当前 session 创建新的 session ID。session_regenerate_id() 使用新生成的 session ID 更新当前
我想稍微保护一下我的应用程序,尤其是我想改进 session 的处理方式。所以,此刻我知道了几个事实: session_regenerate_id(false) 不破坏旧 session sessio
我有一个脚本,用于完成当前 session 并开始一个新 session 。我使用了一段代码,它在我的开发计算机上运行良好。然而,当我将其发布到生产服务器时, session ID 始终保持不变。 以
session_id($randomString) 和 session_regenerate_id() 之间有什么明显区别?两者似乎都改变了 session ID: session_regenerat
我开发了一个 API,最初只能通过浏览器使用,但从未发现问题,但我现在正尝试通过第三方 Android 库 (OkHttpClient) 连接到它,并且我已经测试了我所看到的使用 REST API 测
我正在尝试对我的 Controller (Yii 框架)进行单元测试。 /** * @dataProvider provider */ public function testActi
我对某些 session 功能和 Chrome 进行预取/呈现的方式有疑问。我正在尝试将一个论坛软件 (esoTalk) 与一个自定义的 laravel 4.3 应用程序连接起来。我有身份验证事件监听
好吧,我是 session 的新手,让我们想象一下我们有一个小的登录站点, 这是一个逻辑 登录 如果密码正确 = 使用 $_SESSION[isaloginuser] = 1 使用 if $_SESS
我有标准的身份验证情况...访客填写登录名+密码以形成表单,php 脚本在数据库中对其进行身份验证并重定向回某个页面。 在这个过程中,我们只是在重定向之前客户成功通过身份验证时添加 session_r
通过 session 登录代码时,我随机收到以下错误;警告:session_regenerate_id(): session 对象销毁失败..., 我在 Windows 8.1 Pro 64 位上使用
我正在制作一个消息系统,其中消息ID是session_id并且它位于session_regenerate id上。 它工作正常,但是当我更改模板时,它不断出现如下错误: " Warning: sess
我是一名优秀的程序员,十分优秀!