ci框架长期维护需升级依赖、清理废弃接口、加固输入验证:禁用已弃用的global_xss_filtering;移除ci 2.x遗留的_remap/_output方法;更新csrf_verify()以校验http_origin;替换escape_str()为escape();解耦session驱动;抽象api网关;冻结php 8.2-bookworm镜像;声明必需php扩展;注入api健康检查;新增csrf_origin_whitelist字段。

CI框架长期维护面临代码腐化、安全补丁滞后、社区支持减弱等现实压力,需在不破坏现有功能的前提下持续升级依赖、清理废弃接口、加固输入验证路径。
识别已弃用组件与过期安全策略
打开 application/config/config.php,检查 $config['global_xss_filtering'] 是否设为 TRUE。该配置自 CI 3.1.11 起已被标记为废弃,启用后会强制对所有输出执行双重转义,导致富文本内容被破坏且无法绕过。
运行 php index.php --list-routes(需先启用 CLI 支持),比对输出中是否存在以 _remap 或 _output 开头的控制器方法——这些是 CI 2.x 遗留钩子,在 4.x+ 中已无对应机制,继续存在将造成路由解析异常。
进入 system/core/Security.php,搜索 csrf_verify() 方法体。若其中仍调用 $this->csrf_set_token() 且未校验 $_SERVER['HTTP_ORIGIN'],说明未适配 2025 年起强制要求的跨域 CSRF 防护新规,必须替换为带 Origin 白名单校验的实现。
平滑迁移至受支持的替代方案
方法一:保留核心逻辑,仅替换底层类库
将 system/database/DB_driver.php 中所有 escape_str() 调用,统一替换为 escape();后者在 CI 4.4+ 中已重写为基于 PDO::quote 的安全封装,而前者仍使用易被绕过的正则替换。
方法二:渐进式模块解耦
新建 app/ThirdParty/SessionHandler.php,实现 SessionHandlerInterface,接管原 CI_Session_database_driver 的全部读写操作;【必须禁用 $config['sess_use_database'] = TRUE】,否则旧驱动会与新 Handler 冲突导致 session 数据丢失。
方法三:接口层抽象隔离
在 app/Libraries/ApiGateway.php 中定义 sendRequest() 方法,内部不再直接调用 curl_init(),而是委托给新引入的 GuzzleHttp\Client 实例;同时在构造函数中注入环境标识,使测试环境自动切换到 MockHandler,避免每次 CI 测试都发起真实 HTTP 请求。
构建可验证的长期维护基线
第一步:冻结基础镜像版本
在项目根目录创建 .ci-dockerfile,写入 FROM php:8.2-apache-bookworm —— 必须指定 bookworm(Debian 12),因 CI 框架 3.1.13+ 的 OpenSSL 3.0 兼容补丁仅在该发行版中通过 APT 正式发布。
第二步:声明最小 PHP 扩展集
编辑 composer.json 的 require 区块,显式添加:"ext-mbstring": "*"、"ext-openssl": ">=3.0.0"、"ext-pdo_mysql": "*";缺少任一扩展将导致 CSRF Token 生成失败或数据库连接静默中断。
第三步:注入自动化健康检查
在 application/hooks/PostControllerConstructor.php 中新增钩子逻辑:若当前请求 URI 包含 /api/v1/ 且 $_SERVER['REQUEST_METHOD'] === 'POST',则强制校验 Content-Type: application/json 头存在且未被篡改;不满足条件立即返回 400 错误并记录审计日志路径。
第四步:固化数据库迁移约束
在 application/migrations/20260801000000_add_csrf_origin_whitelist.php 中,使用 $this->dbforge->add_column() 新增 csrf_origin_whitelist TEXT NOT NULL DEFAULT '[]' 字段,并设置 AFTER csrf_token;该字段将被 Security 类用于 Origin 校验,缺失将导致所有 POST 接口拒绝服务。











