应将sess_cookie_name设为无规律字符串(如auth_s47k9m2x),sess_expiration设为60–300秒(如180秒),并配sess_time_to_update=30;同时必须启用httponly、secure、samesite(Strict/Lax)、encryptCookie及强encryption_key,禁用原生session,推荐Redis存储。

sess_cookie_name 和 sess_expiration 怎么设才安全
默认的 sess_cookie_name 是 ci_session,攻击者一眼就能识别这是 CodeIgniter 会话,建议改成无规律字符串,比如 auth_s47k9m2x。同时 sess_expiration 别用默认的 7200(2 小时),敏感操作场景下应压到 60–300 秒,并配合 sess_time_to_update 设为 30 或更短——避免会话 ID 长期不变被重放。
-
sess_expiration = 180(3 分钟)适合后台管理页 -
sess_time_to_update = 30表示每 30 秒就刷新一次 session_id,强制滚动凭证 - 若依赖登录态长期存在(如用户“记住我”),请单独用 token 机制,别延长会话 cookie
httponly、secure、samesite 这三个 flag 必须开
CodeIgniter 4 默认已设 sess_cookie_httponly = true,但容易被手动覆盖或忽略。必须确认它没被关掉;否则 XSS 可通过 document.cookie 窃取 session_id。
-
sess_cookie_secure = true:仅 HTTPS 传输,开发环境也要配好本地 https(如 valet + mkcert) -
sess_cookie_samesite = 'Strict'或'Lax':防 CSRF 的关键防线,CI4.5+ 支持直接填字符串,旧版需用'Strict'而非1 - 不要设
sess_cookie_path = '/'如果应用只跑在子路径下(如/admin),应明确限定为/admin
加密密钥和 sess_encrypt_cookie 必须启用
不开启 sess_encrypt_cookie,cookie 中的 session 数据(如用户角色、权限标记)就是明文 Base64,可被解码篡改。而加密依赖 encryption_key,这个值不能是默认值或短字符串。
- 生成强密钥:运行
openssl rand -hex 32,得到 64 字符 hex 字符串,填入app/Config/Encryption.php的$key - 在
app/Config/Session.php中设public $encryptCookie = true - 注意:一旦开启加密,所有旧会话 cookie 立即失效,前端需重新登录
为什么不能用原生 PHP session
CI4 的 ci_session 表结构带 ip_address、user_agent 字段校验,且默认使用数据库或 Redis 存储,比原生 session_start() 更可控。原生 session 缺少服务端绑定校验,session.use_strict_mode = 1 也难覆盖全部攻击面。
- 禁用原生 session:检查
php.ini是否有session.auto_start = 1,必须关掉 - 确保没在控制器里调用
session_start()或$_SESSION—— CI4 会话由Session类统一管理 - Redis 存储推荐:避免文件存储导致的并发锁和清理延迟问题,
app/Config/Session.php中设$driver = 'redis'并配好$redis参数
sess_cookie_name 或开启 encryptCookie 后,前端已有 cookie 不会自动清除,用户可能卡在“已登录但权限丢失”状态。上线前务必清空测试浏览器 cookie,或加个版本号字段写进 session 数据里做兼容判断。


















