PHP 7.0禁用高危函数仅靠disable_functions不安全,必须同步配置open_basedir限制路径、关闭allow_url_include、expose_php等,并严格按小写无空格逗号格式设置函数列表,重启服务后实测验证。

PHP 7.0 禁用高危函数不能只靠 disable_functions 一行配置就认为安全了。它必须配合路径隔离、远程包含拦截和执行级验证,否则攻击者仍可通过文件写入+动态加载、反序列化或 pcntl_exec 等方式绕过。
确认并修改真正生效的 php.ini
PHP 7.0 的 Web 请求(如 Apache 或 FPM)与命令行(CLI)加载的是不同配置文件,改错位置等于没改:
- 新建
info.php放在网站根目录,内容为<?php phpinfo(); ?> - 浏览器访问
http://localhost/info.php,搜索 Loaded Configuration File —— 这个路径才是你要编辑的文件 - 不要改
php.ini-development或桌面副本;用记事本或 Notepad++ 打开,避免 WordPad 插入不可见字符
正确配置 disable_functions(零容错写法)
该配置项极其敏感,一个空格、大小写错误或末尾逗号都会导致整行失效,PHP 静默丢弃,不报错也不警告:
- 函数名必须全小写:
exec✅,EXEC❌,shell_exec✅,Shell_Exec❌ - 逗号是唯一分隔符,前后**绝对不能有空格**:
exec,system,passthru✅,exec, system❌(system不会被识别) - 禁止换行、禁止末尾逗号:
eval,assert,❌(值变为空) - 推荐完整列表(含 PHP 7.0 仍存在的高危函数):
exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,pcntl_fork,pcntl_waitpid,pcntl_wait,eval,assert,symlink,link,dl,putenv,ini_set,file_put_contents,copy,curl_exec,escapeshellarg,escapeshellcmd
必须同步配置 open_basedir 和关键安全开关
仅禁函数无法防住“写一句话木马再访问执行”这类攻击,必须叠加路径与协议限制:
立即学习“PHP免费学习笔记(深入)”;
- 设置
open_basedir:例如open_basedir = C:\wamp64\www;C:\wamp64\tmp(Windows)或/var/www/html:/tmp(Linux),路径间用英文分号(Win)或冒号(Linux)分隔 - 关闭远程文件加载:
allow_url_fopen = Off且allow_url_include = Off,防止include("http://...")类利用 - 隐藏版本信息:
expose_php = Off,避免 HTTP 响应头泄露 PHP 版本 - 关闭错误显示:
display_errors = Off,同时开启日志:log_errors = On,指定error_log = /path/to/php_error.log
重启服务并实测验证是否真生效
改完保存后,仅刷新页面无效,必须重启对应服务:
- WAMP/XAMPP:重启 Apache 服务
- PHP-FPM:运行
sudo systemctl restart php7.0-fpm(Linux)或通过托盘工具重启(Windows) - 验证不能只查
function_exists('exec')—— 它返回 false 只代表函数不可见,不代表调用被拦截 - 实测执行:
php -r "echo exec('whoami');"(CLI)或在 Web 脚本中写<?php echo system('id'); ?>,应报错或输出空白 - 再测绕过链:
php -r "file_put_contents('test.php', '<?php eval(\$_GET[c]);?>'); echo 'done';",然后尝试访问test.php?c=phpinfo();—— 若能执行,说明open_basedir或权限控制未起作用



















