必须关闭 allow_url_include 以防止远程代码执行:通过 var_dump(ini_get('allow_url_include'))确认运行时状态,修改 php.ini 中 allow_url_include = Off 并重启服务器;共享主机可临时用 .htaccess 的 php_flag allow_url_include off;还需启用 open_basedir、动态 include 白名单及路径规范化校验。

必须关闭 allow_url_include,PHP 7.4 虽默认设为 Off,但本地环境(如 XAMPP、WAMP、MAMP 或自编译安装)常被手动开启,一旦启用,include() 和 require() 就能加载 http://、ftp:// 等远程 URL,攻击者只需控制一个参数,就能执行恶意脚本,直接导致远程代码执行(RCE)。
确认当前是否已开启
别只看配置文件写了什么,要查实际生效值。新建一个 PHP 文件,写入:
<?php var_dump(ini_get('allow_url_include')); ?>
输出 '1' 表示开着,'0' 或空字符串表示已禁用。这个结果反映的是运行时真实状态,受 php.ini、.htaccess、SAPI 多层影响。
立即学习“PHP免费学习笔记(深入)”;
修改 php.ini(最根本有效)
这是唯一推荐的长期方案:
- 用
phpinfo()页面查看 “Loaded Configuration File” 路径,找到真正生效的 php.ini - 打开该文件,搜索
allow_url_include - 将对应行改为
allow_url_include = Off(或= 0),确保前面没被分号;注释掉 - 如果整份文件都找不到这一项,就在
[PHP]段落末尾新增一行:allow_url_include = Off - 保存后,必须重启 Web 服务器(Apache/Nginx)或 PHP-FPM 进程,否则不生效
Apache 下临时覆盖(仅限无法改 php.ini 时)
适用于共享主机或测试环境,但不替代 php.ini 修改:
- 在项目根目录的
.htaccess中添加:php_flag allow_url_include off - 若你有服务器管理权限,也可在
httpd.conf或虚拟主机配置中加:php_admin_flag allow_url_include off - 注意:
php_admin_flag优先级更高且不可被运行时覆盖,但普通用户通常无权修改httpd.conf;而php_flag在 PHP-FPM 模式下可能无效
补充关键防护动作
关掉 allow_url_include 是基础,但防不住本地文件包含(LFI)。还需同步做这几件事:
- 启用
open_basedir,限制 PHP 只能访问指定目录,防止路径穿越读取/etc/passwd等系统文件 - 所有动态
include必须用白名单机制,例如:$pages = ['home' => '/var/www/inc/home.php', 'about' => '/var/www/inc/about.php'];,再根据用户输入查键,不拼接路径 - 对用户输入做路径规范化校验,用
realpath()解析后比对是否落在允许目录内,同时显式拦截php://、data://等伪协议



















