php生产环境必须关闭display_errors、禁用危险函数、隐藏php版本;需配置expose_php=off、display_errors=off、log_errors=on、disable_functions及安全session选项,并严格隔离敏感文件、使用环境变量注入、启用opcache且校验变量。

PHP 生产环境必须关掉 display_errors、禁用危险函数、隐藏 PHP 版本,否则任何未捕获异常或调试输出都可能直接泄露路径、类结构甚至数据库凭证。
php.ini 安全项必须覆盖的 5 个硬性配置
Vercel 或 Docker 部署时,api/php.ini(或容器内 /usr/local/etc/php/conf.d/99-custom.ini)需显式设置以下项,不能依赖默认值:
-
expose_php = Off:防止响应头暴露X-Powered-By: PHP/8.4.20 -
display_errors = Off:避免 HTML 页面中直接打印堆栈(如未 catch 的 PDOException) -
log_errors = On:错误必须写入日志,配合error_log = /var/log/php/error.log -
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec:阻断命令执行链,尤其在用户可控输入调用shell_exec($_GET['cmd'])类场景 -
session.cookie_httponly = On且session.cookie_secure = On:防止 XSS 窃取 session,且仅 HTTPS 传输
敏感文件和路由必须通过部署层隔离
php.ini 只管运行时,但配置文件、密钥、测试脚本等必须在构建/部署阶段剔除,否则 secret_key.php 被误传到 public 目录下,就等于把钥匙挂在门把手上。
- Vercel 用户:在
vercel.json中用excludeFiles明确排除,例如"excludeFiles": "{config/*.php,tests/**,*.env}" - Docker 用户:在
Dockerfile中用COPY --chown=www-data:www-data . /var/www/html/前加.dockerignore,内容包括composer.lock(若含 dev 依赖)、phpunit.xml、storage/logs/* - 所有环境:禁止通过
$_SERVER['DOCUMENT_ROOT'] . '/config/db.php'这类动态拼接路径加载配置,改用getenv('DB_HOST')+ 环境变量注入
OPcache 和 JIT 不是性能开关,而是安全放大器
启用 OPcache 本身不提升安全性,但它能间接降低风险——字节码缓存后,PHP 解析器不再频繁读取磁盘上的 .php 文件,减少了因文件权限错误(如 755 目录下放了可读的 config.php)导致源码被直接下载的可能性。
- 必须设
opcache.validate_timestamps = Off(生产环境),否则每次请求都 stat 文件,既拖慢又暴露文件存在性 - JIT 编译(
opcache.jit=1255)需搭配opcache.enable_cli=1,否则 CLI 模式下预热失效,导致 cron 任务首次执行仍走解释器路径 - 禁用
opcache.file_cache:该选项会将字节码落地到磁盘,若目录权限失控,可能被读取反编译
环境变量注入不是“加个 getenv() 就完事”
很多团队把 getenv('API_KEY') 写进代码就以为安全了,但没验证变量是否真被注入、是否被覆盖、是否为空——结果线上跑着空字符串当密钥,报错信息里还带出 API_KEY= 字样。
- 启动时校验关键变量是否存在:
if (!getenv('DB_PASSWORD')) { throw new RuntimeException('Missing DB_PASSWORD'); } - 禁止在错误消息中拼接环境变量值:
throw new Exception('DB connect failed: ' . getenv('DB_PASSWORD'))是严重泄漏 - Vercel 上区分构建时与运行时变量:构建时用
build.env,运行时才进 PHP 进程;Docker 中用env_file:或environment:,别写进ENV指令再 COPY 到镜像里
最容易被跳过的其实是 disable_functions 的更新节奏——新版本 PHP 增加了 pcntl_fork、stream_socket_client 等潜在利用点,每升级一次 PHP 小版本,都要重新核对官方 Changelog 里的新增函数列表。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











