禁用hyperf危险函数的核心是正确配置php-fpm池文件中的php_admin_value[disable_functions],因其优先级高于php.ini;须全小写、无空格、无尾逗号,并同步关闭allow_url_fopen和allow_url_include,最后通过phpinfo()和实测调用双重验证。

单机部署Hyperf时禁用危险函数,核心是让disable_functions真正作用于Hyperf实际运行的PHP进程——它默认走PHP-FPM,不是CLI也不是Apache模块。配置写错、改错文件、没重启服务,都会导致防护形同虚设。
重点改FPM池配置,不是php.ini
Hyperf作为常驻内存的Swoole/Workerman应用,在FPM模式下仍依赖PHP-FPM处理HTTP请求(如配合Nginx反代)。而FPM池配置(如/etc/php/8.3/fpm/pool.d/www.conf)中php_admin_value[disable_functions]的优先级高于php.ini,漏改这里等于白配。
- 打开对应pool配置文件,添加或修改这一行:
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,assert,eval,file_put_contents,symlink,copy - 函数名必须全小写,逗号后不能有空格,末尾不能有逗号
- Hyperf本身不依赖
curl_exec或scandir等I/O函数,但若项目用了Laravel Scout或自定义扫描逻辑,需保留scandir;curl_exec建议保留,避免HTTP客户端异常
绕过风险要堵死:关闭远程包含
即使禁了exec,攻击者仍可能通过include加载恶意远程脚本执行代码。Hyperf虽不常用include动态加载,但底层框架或第三方包若存在用户可控路径,风险仍在。
- 在同一个FPM pool配置里追加:
php_admin_flag[allow_url_fopen] = offphp_admin_flag[allow_url_include] = off - 这两项必须设为
off,否则include('http://...')或file_get_contents('php://filter/...')仍可触发代码注入
验证必须分环境实测
Hyperf启动靠php bin/hyperf.php start,这是CLI进程;而Web请求走FPM。两者加载不同配置,必须分别验证。
- FPM端验证:访问一个含
<?php phpinfo(); ?>的页面,搜索disable_functions字段,确认值与你写的完全一致 - CLI端验证(Hyperf主进程):
php -r "var_dump(system('id'));"应报Warning: system() has been disabled,而非返回结果 - 别只查
function_exists('system')——它返回false不代表调用被拦截,得真调用才见真章
配合open_basedir做路径隔离
Hyperf项目结构清晰(app/、config/、runtime/),但上传目录或日志目录若在public/下,可能被Webshell利用。open_basedir能从文件系统层面锁死读写范围。
- 在FPM pool配置中加:
php_admin_value[open_basedir] = /var/www/my-hyperf:/tmp -
/var/www/my-hyperf是项目根目录,/tmp是Hyperf写日志、生成代理类的临时位置,二者必须同时放开 - 确保
public/下无可写PHP文件,上传目录(如public/uploads)不应包含在open_basedir中,或单独设更严限制
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











