yii 1.1.26本身不引入文件包含漏洞,但开发者若不当使用include/require等函数拼接用户可控参数(如$_get、$_post),则可能触发lfi/rfi;修复应采用白名单校验+realpath路径隔离,并禁用allow_url_include。

Yii 1.1.26 本身不直接引入文件包含漏洞,但若开发者在代码中**不当使用 include、require、include_once 或 require_once 等函数,并将用户可控参数(如 $_GET、$_POST、$_REQUEST)拼入文件路径**,就可能触发本地文件包含(LFI)甚至远程文件包含(RFI)风险。
检查是否存在危险的动态包含逻辑
重点排查以下几类写法:
-
include $_GET['page'] . '.php';—— 直接拼接,无白名单校验 -
require 'templates/' . $_POST['theme'] . '/layout.php';—— 路径可控且未规范化 -
include $configDir . '/' . $_COOKIE['lang'] . '.ini';—— 使用 Cookie 参数,易被篡改 - 用
basename()或str_replace()简单过滤但绕过容易(如../../../etc/passwd%00)
推荐修复方式:白名单 + 路径隔离
不依赖过滤,而是从设计上杜绝任意路径解析:
- 所有可选模板/配置/语言文件,预先定义合法值数组,只允许从中选取:
$validPages = ['home', 'about', 'contact'];<br>if (in_array($_GET['page'], $validPages)) { include "views/{$_GET['page']}.php"; } - 若需按目录加载,用
realpath()校验路径是否落在预期根目录内:$baseDir = Yii::app()->basePath . '/views';<br>$file = realpath($baseDir . '/' . $_GET['view']);<br>if ($file !== false && strpos($file, $baseDir) === 0) { include $file; } - 禁用远程文件包含:确保 PHP 配置中
allow_url_include = Off(生产环境必须关闭)
框架层加固建议
Yii 1.1.26 自带的 CController::render() 和视图渲染机制默认是安全的,它不接受外部路径参数。问题多出在自定义逻辑中。因此:
- 避免在控制器或组件中手写
include/require;优先用$this->render('viewName')渲染视图 - 检查所有扩展、行为(Behavior)、Widget 中是否含动态包含语句
- 升级前可配合 PHP Insights 扫描项目,它能识别
include($_.*)类高危模式并告警
临时缓解措施(上线前应急)
若无法立即修改代码,可在入口文件(index.php)顶部加全局防护:
- 重写
$_GET/$_POST中疑似路径参数,强制清空或替换为默认值 - 用
set_error_handler()捕获Warning: include(...)日志并告警 - Web 服务器层限制:Nginx 可用
location ~ \.(php|inc|inc\.php|bak|swp)$规则禁止访问敏感后缀











