怎么用disable_functions限制PHP危险函数

秋婷君_1784

秋婷君_1784

2026-10-22

670人浏览

原创

disable_functions可以减少应用对指定内部函数的调用,但不是php安全沙箱,也不能修复内存型rce。配置时应先盘点业务依赖,再在正确的php启动配置中设置,最后从实际web运行环境验收。

PHP 官方网站相关页面截图

先梳理所有调用点,别直接照搬整串函数名单

某些项目会用外部程序生成PDF、处理视频或启动后台任务,相关组件可能依赖进程创建函数。先检索应用、框架和依赖的实际调用点,列明负责人和替代方式,再决定哪些能力确实不需要。

禁用项越多不意味着站点越安全。把正常业务直接禁用,会造成定时任务失败或导出中断,却不会自动收紧数据库账号、站点目录和网络访问权限。应将这项配置放在最小权限与补丁管理之外,作为额外的收敛措施。

这个机制限制内部函数定义,并非覆盖所有执行路径

根据PHP官方说明,该指令只作用于内部函数,不影响用户定义的函数。PHP 8.0起,被禁用函数的定义会被移除,用户代码还能重新使用同名函数名;因此只检查函数名称是否存在,不能完整判断配置是否符合预期。

disable_functions不是可靠的共享主机安全边界。它也不会覆盖语言结构或所有扩展能力,更不能替代PHP2Shell等运行时漏洞的补丁。把几个命令函数列入名单,不等于攻击者已失去所有读写和执行途径。

PHP官方disable_functions说明及不能作为充分安全措施的警告

直接在目标启动配置里设置,再逐步灰度放量

  1. 先确认站点当前使用的解释器、启动配置和FPM池,备份好正在生效的配置。别只修改命令行读取的配置文件,也别把修改逻辑写到普通业务请求里,指望它能全局生效。

  2. 在隔离测试环境里选最小范围的禁用集合,覆盖登录、导出、图片处理、队列和计划任务。如果业务确实要依赖外部工具,优先评估单独部署低权限工作服务,不要直接给整个站点放开所有执行权限。

    btpanel phpsite 宝塔面板PHP网站
    btpanel phpsite 宝塔面板PHP网站

    宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

    下载
  3. 配置测试通过后,选维护窗口重启替换目标服务进程,走受保护的Web检查入口读取实际生效值,再逐台节点核对。留存好原始配置和回退记录,不要单靠某一个页面访问成功就当成全量验收通过。

; php.ini中的示例:仅在确认业务不依赖这些函数后使用
disable_functions = exec,passthru,shell_exec,system,popen,proc_open

名单使用逗号分隔。对多版本、多池部署,应核对管理层附加设置及实际生效值;配置文件里出现了某一行,不代表处理这个站点请求的进程已经加载它。

业务情况 配置策略 额外控制
纯Web请求无外部程序 禁用确认不需要的进程函数 代码目录只读、低权限账号
媒体或报表需外部程序 按服务职责分离能力 独立工作账号、参数校验与资源边界

同步核对配置名单、函数定义和运行模式三项

下面的只读脚本会把配置里的禁用项、对应函数是否存在、存在的话是不是内部原生函数分开展示。它不会执行任何系统命令,也不涉及绕过演示,输出结果仅用来辅助排查环境差异,不能直接作为系统安全合规的结论。

<?php // 不调用任何被检查函数,只读取配置并观察函数定义是否存在。
$disabled = array_filter(array_map('trim',explode(',',(string)ini_get('disable_functions'))));
printf("PHP %s / SAPI %s\n",PHP_VERSION,PHP_SAPI);
printf("%-12s %-8s %-8s %s\n",'function','listed','exists','internal');
foreach (['exec','system','shell_exec','proc_open'] as $name) {
    $exists = function_exists($name);
    $internal = $exists ? (new ReflectionFunction($name))->isInternal() : null;
    printf("%-12s %-8s %-8s %s\n",$name,
        in_array($name,$disabled,true) ? 'yes':'no',
        $exists ? 'yes':'no', $internal===null ? 'n/a':($internal ? 'yes':'no'));
}
echo "Absence is not proof of disabling; check build, SAPI and configuration.\n";

保存为audit.php后执行下方命令。本地在macOS上的PHP 8.5.10 WebAssembly环境运行;有些函数可能因构建本身未提供而不存在,不能把这一现象误认为生产配置已经禁用成功。

php audit.php

只读示例的真实运行输出:禁用名单、函数存在性及内部定义三项独立观察,未执行任何外部命令

核查函数是否存在的时候要注意,官方文档本身就把语言结构和普通函数做了区分。不要靠实际执行系统命令的方式验证禁用效果,尤其不要在公网暴露能接收命令参数的诊断页面。

PHP官方函数存在性检查说明,区分函数与语言结构

出故障后按四类典型现象排查定位

  • 排查发现配置值始终没更新:核对实际加载的配置文件、FPM池和运行进程有没有完成重启替换。
  • 目标函数不存在但禁用名单为空:逐一核查扩展、编译构建参数和SAPI类型,不要直接判定禁用生效。
  • 同名函数依然可以调用:核对它是不是用户自定义或者兼容层实现的,同时检查业务代码有没有自己写了替代逻辑。
  • 导出功能或者后台任务报错:先理清具体依赖项,按职责拆分不同的运行环境,别直接把禁用名单全清空。

每次新增依赖或者升级框架之后,都要重新审核外部程序的调用需求。禁用名单的每一次调整都要留变更记录和业务验证依据,不能拿它当借口长期不更新PHP版本、不做站点账号隔离、不巡检可写目录。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php2shell漏洞 php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

11184

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6501

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2155

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4108

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4834

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3791

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5437

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4262

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12202

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习