php文件包含必须禁止用户直接控制参数,应采用白名单映射、路径净化、环境限制及静态包含等多重防护措施。

PHP文件包含参数不能由用户直接控制——这是安全底线。一旦允许用户输入(比如 $_GET['file'])未经校验就传入 include 或 require,就极易触发本地文件包含(LFI)或远程文件包含(RFI)漏洞。
白名单机制:只允许可信路径
最可靠的方式是彻底放弃动态拼接,改用预定义的映射关系:
- 建立一个关联数组,键为安全标识符(如
'header'、'menu'),值为对应的真实绝对路径(如/var/www/app/views/public/header.php) - 接收用户参数后,仅作为键去查表,不参与字符串拼接
- 查不到则中止执行,不回退到默认文件或尝试猜测路径
- 示例:
$files = ['header' => '/safe/path/header.php', 'footer' => '/safe/path/footer.php']; $page = $_GET['view'] ?? ''; if (!isset($files[$page])) { die('Access denied'); } include $files[$page];
路径净化与范围锁定
若业务逻辑确实需要一定灵活性,必须叠加多层防护:
- 用
basename()剥离目录遍历符号(../、..\),防止跨目录访问 - 限定基础目录,拼接前先拼上固定前缀,再用
realpath()和strpos()校验是否仍在授权范围内 - 禁止点号开头的文件名(如
.env、.htaccess),避免读取隐藏配置 - 检查文件是否存在且为普通文件(
is_file()),排除目录或特殊设备节点
环境级硬性限制
光靠代码层过滤不够,需配合 PHP 配置收紧攻击面:
- 在
php.ini中关闭远程包含:allow_url_include = Off - 设置开放目录白名单:
open_basedir = /var/www/app/:/tmp/,超出即报错 - 禁用危险函数(可选):
disable_functions = include,include_once,require,require_once(适用于完全不需要运行时包含的场景) - 确保 Web 服务器(如 Nginx/Apache)不将非 PHP 文件当作脚本执行,防止日志文件等被解析利用
替代方案:优先静态包含与自动加载
很多所谓“动态包含”需求其实可以规避:
- 把页面逻辑拆成控制器+视图,入口统一
require固定几个核心文件,路由由框架或手工 switch 决定渲染哪个视图 - 类库使用 PSR-4 自动加载,通过命名空间映射到磁盘路径,无需手动
include - 配置、模板片段等用常量或函数封装,而不是靠外部文件路径注入
- 真有模板复用需求,用模板引擎(如 Twig、Smarty)的
{% include %},它默认沙箱隔离、路径受限
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











