CodeIgniter 3添加WAF后出现用户账号互访异常问题求助
问题分析
部署WAF后出现会话串用,核心原因大概率是WAF导致CodeIgniter无法正确识别客户端的唯一标识(IP/UA),或是Session生成、验证逻辑在WAF转发下出现异常。结合共用公网IP和移动端的场景,以下是针对性排查与修复方案:
1. 确保CodeIgniter获取真实客户端IP
WAF作为反向代理时,CI默认会把WAF的IP识别为客户端IP,这会导致同一企业内网的所有用户被判定为同一个IP,若Session匹配策略宽松,极易出现串用。
- 在
config.php中添加WAF的IP地址到信任代理列表:
配置后CI会从$config['proxy_ips'] = '192.168.1.0/24'; // 替换为你的WAF公网/内网IP段X-Forwarded-For或X-Real-IP头中提取用户真实IP,而非WAF的IP。
2. 调整Session匹配与再生策略
当前配置中sess_time_to_update=60(每分钟再生Session ID),结合sess_regenerate_destroy=TRUE,若WAF存在请求缓存或转发延迟,可能引发新旧Session ID冲突:
- 先将
sess_time_to_update调回默认的300秒(5分钟),降低Session再生频率:$config['sess_time_to_update'] = 300; - 若共用公网IP的用户内网IP不同,在完成步骤1确保CI能获取真实IP后,可开启
sess_match_ip=TRUE,利用内网IP区分会话:$config['sess_match_ip'] = TRUE;
3. 优化Cookie配置
当前cookie_domain为空,可能导致Cookie在跨子域或特定场景下无法正确传递,被WAF误处理:
- 设置正确的Cookie域名,比如企业内部系统的根域名:
$config['cookie_domain'] = '.yourcompany.com'; // 替换为实际域名,前缀点确保所有子域有效 - 若系统支持HTTPS,排查429错误的原因(通常是WAF频率限制),尝试逐步开启
cookie_secure=TRUE,同时联系运维调整WAF登录/登出接口的频率阈值:$config['cookie_secure'] = TRUE;
4. 检查Session数据库表结构
确保ci_sessions表结构符合CI3要求,特别是ip_address和user_agent字段能正确存储用户标识:
CREATE TABLE IF NOT EXISTS `ci_sessions` ( `id` varchar(128) NOT NULL, `ip_address` varchar(45) NOT NULL, `timestamp` int(10) unsigned DEFAULT 0 NOT NULL, `data` blob NOT NULL, `user_agent` varchar(120) NOT NULL, PRIMARY KEY (id), KEY `ci_sessions_timestamp` (`timestamp`) );
若表中缺失user_agent字段,需及时添加——当前配置开启了sess_match_useragent=TRUE,缺失该字段会导致Session验证失效。
5. 排查WAF的会话缓存/转发规则
联系运维检查WAF配置:
- 禁止WAF对Session Cookie(
ciapp_session)进行缓存或修改 - 确保WAF转发所有请求头(尤其是
User-Agent、X-Forwarded-For)时不做篡改 - 排除登录、个人资料等敏感接口的WAF缓存策略
内容的提问来源于stack exchange,提问作者Esar-ul-haq Qasmi
相关产品推荐
相关产品推荐

