PHP 7.1 不改变 include 语法,但通过严格类型、错误处理等间接提升安全性;安全关键在于路径可控、白名单校验、禁用远程包含、优先用 require_once 及绝对路径隔离。

PHP 7.1 本身**不改变 `include` 的语法或安全机制**,但它提供了更严格的类型控制、错误处理和面向对象能力,这些可以**间接提升 `include` 使用的安全性**。真正决定 `include` 是否安全的,是**你怎么用它**——尤其是路径来源、是否可控、是否经过校验。 下面从实际开发角度,讲清楚怎么在 PHP 7.1+ 环境中写出更安全的 `include` 代码:
避免动态拼接不可信路径
这是最常见也最危险的做法:把用户输入(如 URL 参数、表单值)直接拼进 `include` 路径。
不安全示例:
// ❌ 千万别这么写!
$page = $_GET['page'] ?? 'home';<br>include $page . '.php'; // 攻击者传 page=../../etc/passwd 就可能读取系统文件
安全做法:
- 用白名单严格限制可引入的文件名
- 绝不信任任何外部输入,包括 `$_GET`、`$_POST`、`$_COOKIE`
- 路径必须硬编码或从预定义数组中选取
使用绝对路径 + 目录隔离
相对路径容易被绕过(如 `../`),而绝对路径配合固定目录结构能大幅降低风险。
推荐写法:
define('VIEWS_DIR', __DIR__ . '/views/');<br>$allowed = ['home', 'about', 'contact'];<br>$page = $_GET['page'] ?? 'home';<br><br>if (in_array($page, $allowed)) {<br> include VIEWS_DIR . $page . '.php';<br>} else {<br> include VIEWS_DIR . '404.php';<br>}
这样既明确限定范围,又避免路径穿越。
优先用 `require_once` 替代 `include`
`include` 失败只发警告,脚本继续执行,可能导致后续逻辑出错甚至信息泄露;`require_once` 在失败时抛出致命错误,强制中断,更利于暴露问题、防止意外流程继续。
尤其对关键配置、核心类文件,必须用 `require_once`:
require_once __DIR__ . '/config/database.php';<br>require_once __DIR__ . '/lib/Router.php';
配合 PHP 7.1+ 的严格模式(如启用 `declare(strict_types=1);`)还能进一步约束函数参数类型,减少因包含失败导致的隐式类型转换漏洞。
禁用远程文件包含(关键防线)
确保 `php.ini` 中以下两项为关闭状态(PHP 默认已关,但需确认):
-
allow_url_include = Off(必须关!否则 `include 'http://xxx/shell.php'` 可直执行远程恶意代码) -
allow_url_fopen = Off(非必需但强烈建议,减少 SSRF 和文件读取风险)
可通过代码运行时检查:
if (ini_get('allow_url_include')) {<br> throw new RuntimeException('allow_url_include is enabled — security risk!');<br>}
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











