yii 1.1.26 防护文件包含漏洞需综合服务器配置、php 设置、代码审计与入口安全初始化:隔离敏感目录、禁用 allow_url_include/allow_url_fopen、禁用危险函数、清除动态 include、白名单控制模板加载,并在入口文件顶部设环境常量、关闭错误显示、限制资源。

Yii 1.1.26 修改入口文件本身不能直接防护文件包含漏洞,但配合正确的部署结构和服务器配置,能有效切断攻击路径。关键不在于“改入口文件名”,而在于消除用户可控参数进入 include/require 函数的可能,并阻止对敏感路径的直接访问。
入口文件位置与 Web 根目录隔离
默认的 web/index.php 是合理设计:它把所有静态资源和入口逻辑放在 Web 可访问目录下,而 protected/、vendor/、config/ 等敏感目录位于其上级,无法被 URL 直接请求。若你把入口文件移到项目根目录(如 index.php),必须同步确保:
- Web 服务器(Nginx/Apache)仅将
/路由到该新入口,且严格禁止访问protected/、config/、runtime/、vendor/等目录 - Nginx 配置中加入明确拒绝规则,例如:
location ~ ^/(protected|config|runtime|vendor)/ { deny all; } - Apache 的
.htaccess中添加:
Deny from all 到对应目录下
禁用危险 PHP 配置(服务端强制)
文件包含漏洞利用依赖 PHP 的流封装协议和配置项。必须在服务器层面关闭高危能力:
- 设置 allow_url_include = Off(彻底禁用远程文件包含 RFI)
- 设置 allow_url_fopen = Off(降低 LFI 配合
php://input或日志注入的风险) - 确保 disable_functions 中包含
unserialize, file_get_contents, highlight_file, show_source等易被链式利用的函数 - 这些配置须写入
php.ini或 PHP-FPM pool 配置,不能靠ini_set()动态修改(后者在 include 前可能已失效)
清理代码中任何用户控制的 include 行为
Yii 1.1.26 本身不使用动态 include 加载控制器或视图(它走路由+渲染机制),但开发者常在自定义模块、插件或旧兼容代码中误用。必须人工审计并替换所有类似写法:
- ❌
include($_GET['tpl'] . '.php'); - ❌
require_once 'views/' . $_POST['page'] . '.php'; - ✅ 改为白名单硬编码或 Yii 内置视图渲染:
$this->render('user/profile', ['model' => $model]); - ✅ 若必须动态选模板,用固定数组映射:
$views = ['profile' => 'user/profile', 'settings' => 'user/settings'];
if (isset($views[$_GET['v']])) { $this->render($views[$_GET['v']]); }
强化入口文件自身安全边界
在 index.php(无论放在哪)顶部立即加入最小化信任初始化:
- 定义环境常量并校验:
defined('YII_ENV') or define('YII_ENV', 'prod'); - 禁用错误回显(防止路径泄露):
ini_set('display_errors', '0'); - 限制脚本执行时间与内存(增加利用难度):
set_time_limit(30); ini_set('memory_limit', '128M'); - 确保
YII_DEBUG未定义或为false(避免调试信息暴露绝对路径)











