CodeIgniter 3 和 4 的会话安全需从驱动选择、加密设置、Cookie 属性和运行时操作四方面同步加固:CI3 需手动加载、强密钥、显式 regenerate;CI4 依赖驱动抽象、过滤器与自动生命周期管理,且均须禁用静默降级、限制有效期并关闭开发模式。

CodeIgniter 3 和 4 的会话配置不能只靠默认值,安全必须从驱动选择、加密设置、Cookie 属性和运行时操作四方面同时加固。两者底层机制不同,配置方式和关键风险点也有明显区别。
CI3:手动加载+强密钥+会话再生
CI3 的 Session 需显式启用,且极易因配置疏漏导致固定攻击或数据泄露:
- 必须在 application/config/config.php 中设置 $config['encryption_key'](32 字符以上随机密钥,用
openssl rand -base64 32生成);不设则会话无法加密,sess_encrypt_cookie失效 - 禁用文件默认路径风险:不要依赖系统
/tmp,手动创建专用目录(如/var/www/ci3_sessions),并赋予权限:chmod 700,再配置 $config['sess_save_path'] = '/var/www/ci3_sessions' - 登录成功后立即调用
$this->session->regenerate(TRUE),强制销毁旧 session ID,阻断会话固定 - 开启匹配防护但需权衡:设置 $config['sess_match_ip'] = TRUE 和 $config['sess_match_useragent'] = TRUE,适用于 IP 稳定的内网场景;公网用户若使用动态 IP 或频繁切换网络,可能触发误踢
- 生产环境务必启用 HTTPS,并设 $config['sess_secure_cookie'] = TRUE、$config['cookie_httponly'] = TRUE、$config['cookie_samesite'] = 'Strict'
CI4:驱动抽象+过滤器+自动生命周期管理
CI4 的 Session 已重构为独立组件,更强调驱动隔离与请求生命周期控制,文件存储(FileHandler)在高并发下易锁死:
- 避免使用默认 FileHandler 做生产部署;优先选 DatabaseHandler 或 RedisHandler。Redis 配置示例:
$config['session.driver'] = 'redis'; $config['session.savePath'] = 'tcp://127.0.0.1:6379?database=2&timeout=30'; - 加密密钥在 app/Config/Encryption.php 中配置 $key,必须为 16/24/32 字节(AES 兼容长度),不可为空
- Session Cookie 安全属性统一由 app/Config/Cookie.php 控制:$secure = true、$httponly = true、$samesite = 'Strict' —— 这三者缺一不可,否则 HTTPS 下仍可被 HTTP 页面窃取 cookie
- 敏感操作前必须加认证过滤器,例如在 app/Config/Filters.php 中注册自定义
AuthGuard,并在路由中绑定:$routes->add('admin/dashboard', 'Admin::index', ['filter' => 'auth']); - 无需手动 regenerate —— CI4 默认在每次请求后自动刷新 session ID(由
Security.php中 $regenerate = true 控制),但登录成功后仍建议调用$this->session->regenerate()确保即时生效
共性安全底线:无论 CI3 还是 CI4 都必须做
以下配置错误在真实线上事故中高频出现,属于“低级但致命”项:
- 未关闭开发模式:上线前确认 index.php 中 ENVIRONMENT 设为
'production',防止错误信息泄露路径、数据库结构等敏感内容 - 未限制会话有效期:CI3 设置 $config['sess_expiration'] = 7200(2 小时),CI4 在 app/Config/Session.php 中设 $ttl = 7200;同时开启 $config['sess_expire_on_close'] = TRUE(CI3)或 $expireOnClose = true(CI4)
- 未禁用静默降级:CI4 的 Redis 驱动若连接失败,默认 fallback 到 FileHandler —— 必须在 app/Config/Session.php 中设 $failOver = false,让故障立刻暴露,而非悄悄降级引入安全隐患
- 未验证配置是否生效:CI3 打印
ini_get('session.save_path'),CI4 查看session()->getDriverName()和日志,确保实际使用的驱动与配置一致


















