hyperf生产环境必须设app_env=prod、display_errors=off、show_trace=false,并禁用whoops,否则原始php错误将暴露敏感信息。需验证响应无x-debug-token、x-powered-by头,且故意触发语法错误时仅返回简洁500页而非堆栈详情。

Hyperf 在生产环境中默认会隐藏详细的错误信息,防止敏感代码或配置泄露。若你在生产环境看到类似“语法错误”“Parse error”等原始 PHP 错误提示,说明当前环境未正确启用生产防护,存在安全风险。
确认当前是否为生产环境
Hyperf 依靠 APP_ENV 环境变量判断运行模式。需确保:
-
.env 文件中设置
APP_ENV=prod(或production) - 未在代码中手动覆盖
Hyperf\Contract\ApplicationInterface::getEnv()或通过setenv强制设为dev - PHP 的
display_errors配置为Off(可通过phpinfo()或ini_get('display_errors')验证)
关闭错误详情展示的关键配置
仅靠 APP_ENV=prod 不足以完全屏蔽错误堆栈。还需检查并确保以下配置生效:
- 在
config/autoload/exceptions.php中,ignore_exception应为false,但show_trace必须为false - 自定义异常处理器(如继承
Hyperf\ExceptionHandler\ExceptionHandler)中,shouldReport()返回true,但render()方法在生产环境下应返回通用提示(如500 Internal Server Error),而非$exception->getTraceAsString() - 禁用
whoops:确保未安装hyperf/whoops组件,或已在config/autoload/dependencies.php中移除WhoopsExceptionHandler的绑定
验证与上线前检查
部署后建议快速验证防护是否生效:
- 故意触发一个语法错误(例如在控制器中写
echo [;),访问接口应返回简洁的 500 页面,而非带文件路径、行号、代码片段的报错页 - 检查响应头中不含
X-Debug-Token或X-Powered-By: Hyperf(后者可通过config/autoload/server.php中'settings' => ['server_signature' => '']移除) - 查看日志(
runtime/logs/hyperf.log)是否有完整异常堆栈 —— 生产环境应记录,但绝不输出到前端
常见被忽略的泄漏点
即使配置正确,仍可能因以下原因暴露代码细节:
- 使用了第三方中间件(如某些 JWT 验证组件)自带的调试输出,未适配生产模式
-
config/autoload/constants.php或di.php中存在语法错误,导致框架启动失败 —— 此类错误发生在异常处理器加载前,PHP 原生错误仍可能直接输出,需依赖 Web 服务器(Nginx/Apache)的error_page或php_flag display_errors off拦截 - Docker 镜像中残留开发工具(如 xdebug),虽不启用但仍可能影响错误渲染逻辑











