XAMPP默认禁用RFI,因allow_url_include=Off是PHP硬性安全限制,与Apache端口、VirtualHost等网络配置无关;启用RFI唯一有效方式是修改php.ini中allow_url_include=On并重启Apache。

XAMPP 默认禁止远程文件包含(RFI),无论你配多少端口,allow_url_include 关闭时 include 或 require 都无法加载 http:// 或 https:// 开头的远程 URL —— 这是 PHP 的硬性安全限制,和 Apache 端口配置无关。
为什么改 Listen 和 VirtualHost 对 RFI 完全无效
多端口(如 Listen 8080、Listen 8081)只影响 Apache 接收请求的网络入口,不改变 PHP 的运行时行为。远程文件包含是否生效,只取决于 PHP 解释器自身的配置项,与端口数量、域名绑定、虚拟主机结构完全解耦。
-
VirtualHost *:8080只决定“哪个目录响应http://localhost:8080/”,不决定“PHP 脚本能 include 什么” - 即使你用
curl或浏览器能正常访问http://localhost:8080/remote.php,PHP 仍会拒绝include 'http://localhost:8080/remote.php',除非allow_url_include开启 - 端口冲突、403 错误、
DocumentRoot路径错误等问题,只会让页面打不开,但不会让 RFI “意外生效”
必须修改 php.ini 中的 allow_url_include
在 XAMPP 中启用 RFI 的唯一有效路径,是显式开启 PHP 的 allow_url_include 指令。该配置默认为 Off,且从 PHP 5.2 起就被强烈建议保持关闭。
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 打开
XAMPP\php\php.ini(不是 Apache 的httpd.conf) - 搜索
allow_url_include,找到这一行:allow_url_include = Off - 将其改为:
allow_url_include = On - 保存后,**必须重启 Apache**(仅重启 PHP-FPM 不够,XAMPP 的 PHP 是模块嵌入式)
- 验证是否生效:新建一个
test.php,内容为<?php echo ini_get('allow_url_include'); ?>,访问应输出1
开启后仍无法 RFI?检查这三点
即使 allow_url_include = On,实际调用仍可能失败,常见原因不是端口或虚拟主机问题,而是:
-
allow_url_fopen也必须为On(allow_url_include依赖它,XAMPP 默认开启,但若手动关过需一并确认) - 远程 URL 必须可被 PHP 进程直接访问 —— 如果你在本地跑 XAMPP,却 try include
http://example.com/shell.php,得确保 Apache 所在机器能出网;若 includehttp://127.0.0.1:8081/payload.php,则要确认该端口 Apache 正在监听且没被防火墙拦截 - PHP 脚本里不能写错协议,比如漏掉
http://写成include '127.0.0.1/payload.php',这会被当成本地路径处理,触发 LFI 而非 RFI
真正要小心的不是“怎么开”,而是“开了之后谁都能传 URL 进来”——一旦代码里有 include $_GET['file'] 且未过滤,攻击者立刻能执行任意远程脚本。端口再多、域名再花哨,都挡不住这个漏洞链。所以生产环境永远不要开 allow_url_include,开发调试也尽量用本地文件模拟。

















