CI框架Session模块缺陷与解决方案【Session】

轻瑶君_1165

轻瑶君_1165

2026-08-09

907人浏览

原创

ci框架session模块在高并发下因redis锁机制缺陷导致数据覆盖,ci3/ci4均存在非原子“检查→设置”漏洞;ci4虽引入重试但未根除竞争;修复方案包括改用setnx、禁用自动锁并手动原子加锁。

ci框架session模块缺陷与解决方案【session】

CI框架Session模块在高并发场景下因锁机制设计缺陷,导致多个请求同时写入session时数据被覆盖或丢失,用户登录态频繁失效、购物车商品随机消失、表单提交后状态重置等问题集中爆发。

CI3/CI4 Redis驱动中的锁竞争漏洞

CI3和CI4的Redis session驱动均未正确使用原子操作获取锁,而是依赖非原子的“检查→设置”两步逻辑,造成并发请求同时通过ttl判断并成功写入lock_key。

第一步:查看当前锁key的TTL值 → 若返回-2(key不存在)或正值,直接进入下一步;【此时两个并发请求都看到-2,都会继续执行set操作】

第二步:调用redis::set(lock_key, timestamp, ['ex'=>300]) → 该命令不具备排他性,无法阻止第二个请求覆盖第一个请求的锁。

结果是两个请求都认为自己持有了锁,同时对session数据进行读-改-写,最终仅最后一次写入生效,中间修改彻底丢失。

CI4中已修复但仍有隐患的循环等待逻辑

CI4后续版本将锁获取逻辑改为带重试的循环,但未从根本上解决竞争条件:

方法一:使用redis::setNx()替代set()

redis::setNx(lock_key, timestamp)仅在key不存在时才写入并返回true,否则返回false——这是真正具备原子性的加锁原语。

Session Cleaner
Session Cleaner

清理过期OpenClaw会话文件,保留当前主会话和所有群组会话,其余移至备份目录。

下载

方法二:强制启用EXPIRE+SETNX组合(需手动封装)

先执行redis::setNx(lock_key, '1'),再立即执行redis::expire(lock_key, 300),两次操作必须原子执行;若中间被其他请求插入,则锁可能失效。

【注意:PHP Redis扩展的pipeline或transaction无法保证跨命令原子性,此组合仍存在微小窗口期】

绕过锁缺陷的临时加固方案

步骤一:禁用Redis驱动的自动锁机制,在配置中设置 $config['sess_locking'] = FALSE;

步骤二:将session写操作集中到单一入口,例如所有更新都通过$this->session->set_userdata(['cart'=>$new_cart])统一触发,避免分散调用→write();

步骤三:在关键业务逻辑前手动加锁,使用redis::set($lock_key, time(), ['nx','ex'=>30]) → 这是Redis 2.6.12+支持的原子加锁命令,失败则sleep(50ms)后重试,最多尝试10次。

步骤四:session读操作无需加锁,但读取后若需修改,必须先完成步骤三的加锁流程,再读→改→写→释放锁(del $lock_key)。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

2023.10.17

580

4

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

2023.10.18

856

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1726

14

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

2026.09.21

0

20

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

2026.09.21

0

24

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

2026.09.21

0

20

NumPy广播机制数学运算与统计分析
NumPy广播机制数学运算与统计分析

本专题整理 NumPy 广播机制、数组数学运算与统计分析相关教程,覆盖广播规则、维度对齐、矩阵与数组加减除法、向量化计算、均值方差、分位数、中位数、直方图和 unique 频次统计等场景,帮助读者掌握 ndarray 高效计算与统计处理方法。

2026.09.21

0

17

NumPy数组创建索引切片与数据选择
NumPy数组创建索引切片与数据选择

本专题整理 NumPy 数组创建、索引、切片与数据选择相关教程,覆盖 np.array、zeros/ones、多维数组形状、基础切片、花式索引、布尔索引、条件筛选、视图与副本等常用场景,帮助读者系统掌握 ndarray 数据构造与高效提取方法。

2026.09.21

0

12

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

20

13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Beego 官方文档首页
Beego 官方文档首页

共0课时 | 0人学习

Laravel 5.8 中文文档手册
Laravel 5.8 中文文档手册

共74课时 | 138.9万人学习