核心是修改php.ini中disable_functions指令并重启服务:需分别确认apache/fpm/cli对应php.ini路径,严格按小写、无空格、无逗号末尾格式填写函数列表,重启服务后用php -r和test.php双重验证生效。

在Ubuntu上配置PHP 8禁用危险函数,核心是修改php.ini中的disable_functions指令,并配合重启服务与验证。这不是可选操作,而是生产环境必须落实的基础防护。
找到并编辑正确的php.ini文件
PHP 8在Ubuntu中可能有多个配置文件,取决于运行模式(Apache模块、PHP-FPM或CLI)。先确认实际生效的配置路径:
- 执行
php --ini查看CLI环境加载的配置 - 执行
phpinfo();页面或php -r "echo php_ini_loaded_file();"获取Web环境真实路径 - 常见位置包括:
/etc/php/8.1/apache2/php.ini(Apache)、/etc/php/8.1/fpm/php.ini(PHP-FPM)、/etc/php/8.1/cli/php.ini(命令行)
设置disable_functions并精简函数列表
打开对应php.ini文件,搜索disable_functions。若不存在,可在[PHP]段落下新增一行;若已存在但被注释(以分号开头),请取消注释。填入以下函数(逗号分隔,**无空格**):
exec,system,passthru,shell_exec,popen,proc_open,pcntl_exec,eval,assert,symlink,link,chmod,chown,chgrp,dl,putenv,ini_set,curl_exec,curl_multi_exec,parse_ini_file,show_source,escapeshellcmd,escapeshellarg- 注意:
curl_exec和curl_multi_exec虽非系统调用,但常被用于SSRF或恶意外连,建议一并禁用 - 避免盲目照搬长列表——检查业务是否依赖其中某个函数(如某些旧CMS用
ini_set动态调优),必要时剔除
同步加固其他关键安全项
仅禁用函数不够,需配套限制访问范围与信息暴露:
- 设置
open_basedir = /var/www/html:/tmp(按实际网站根目录调整),防止跨目录读取 - 关闭
expose_php = Off,避免HTTP响应头泄露PHP版本 - 关闭
display_errors = Off,开启log_errors = On并指定error_log = /var/log/php_errors.log - 禁用远程包含:
allow_url_fopen = Off和allow_url_include = Off
重启服务并验证是否生效
保存php.ini后,必须重启对应服务才能使配置加载:
- Apache用户:运行
sudo systemctl restart apache2 - PHP-FPM用户:运行
sudo systemctl restart php8.1-fpm(版本号请替换为实际值) - 验证方式1:终端执行
php -r "var_dump(ini_get('disable_functions'));",确认输出含你添加的函数名 - 验证方式2:新建
/var/www/html/test.php,内容为<?php echo exec('id'); ?>,浏览器访问应返回空白或警告“Function disabled”
不复杂但容易忽略:每个PHP运行模式(Apache/FPM/CLI)都有独立的php.ini,务必逐个检查并统一加固。安全不是加一道锁,而是让每把钥匙都只开该开的门。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











