PHP 8 默认开启的安全配置项有哪些需要检查?
核心结论:PHP 8.0.0 起 assert.exception 默认值从"0"改为"1",PHP 8.3.0 起 5 个 assert 相关配置项被弃用,生产环境必须手动检查至少 8 项关键安全配置。
原因分析
PHP 8 系列版本在安全配置上做了多项调整,但默认设置并不完全适合生产环境。根据 2026 年 4 月 12 日的运行时配置文档,assert.exception 在 PHP 8.0.0 之前默认是"0",8.0.0 之后改为"1",这意味着断言失败会直接抛出异常而非仅发出警告。同时,PHP 8.3.0 起 assert.active、assert.bail、assert.warning、assert.callback、assert.exception 这 5 个配置项全部被标记为弃用状态。腾讯云开发者社区 2026 年 4 月 25 日的资料指出,默认 php.ini 没有打开安全模式,safe_mode 默认关闭,这导致 system() 等危险函数默认可用。
必须检查的 8 项核心配置
1. display_errors 和 log_errors
阿里云开发者社区 2023 年 1 月 4 日的资料明确:生产环境必须设置 display_errors = Off 和 log_errors = On。PHP 8.5 安全配置建议(2026 年 3 月 3 日)强调,PHP 8.5 默认在异常堆栈中显示脱敏后的参数值,如果没关掉 display_errors,用户手机号、token 前几位会明文展示到前端页面。
2. expose_php
腾讯云开发者社区 2026 年 4 月 5 日的资料指出:默认情况下 PHP 版本会被显示在返回头里,如 response headers x-powered-by: php/7.2.0,必须设置 expose_php = off 来隐藏版本信息。
3. register_globals
多个来源(阿里云 2023 年 1 月 4 日、腾讯云 2026 年 4 月 5 日)一致建议:register_globals = Off。PHP 在 4.2.0 以前的版本中默认开启,4.2.0 后默认禁用,但无论什么版本都要显式禁用。
4. allow_url_fopen
阿里云开发者社区 2023 年 1 月 4 日的 8 个必须修改配置中第 0x01 项:allow_url_fopen = Off。像 fopen 的文件处理函数接受 URL 参数,可以轻松访问远程资源,这是重要的安全威胁。
5. open_basedir
PHP 8.5 安全配置建议(2026 年 3 月 3 日)强调:open_basedir 不是可选项,而是隔离底线。必须在 PHP-FPM 的 pool 配置里设(如/etc/php/8.5/fpm/pool.d/www.conf),而不是只在 php.ini 里设。推荐格式:open_basedir = /var/www/example.com/:/tmp/:/proc/self/fd/,注意末尾的冒号和斜杠,/tmp/和/tmp 效果不同。
6. disable_functions
PHP 8.5 安全配置建议(2026 年 3 月 3 日)列出必须覆盖三类函数:执行类(exec, passthru, shell_exec, system, proc_open, popen)、代码执行类(eval, assert)、文件操作类(symlink, link, chmod, chown, chgrp, curl_exec)。修改后一定要检查是否生效:php -i | grep disable_functions。
7. max_execution_time 和 memory_limit
阿里云开发者社区 2023 年 1 月 4 日建议配置:max_execution_time = 30(默认值)、max_input_time = 60、memory_limit = 16M、upload_max_filesize = 2M、post_max_size = 8M。运行时配置文档显示 max_execution_time 默认"30",max_input_vars 默认 1000。
8. 会话安全配置
截至 2024 年 4 月 15 日的会话安全文档指出:session.trans_sid_tags 在 PHP 7.1.0 及以上可用,session.referer_check 建议启用。session.cache_limiter 应设为 nocache,确保已认证会话的 HTTP 内容不会被浏览器缓存。
PHP 8 特有安全改进
根据 2025 年 11 月 17 日的资料,PHP 8 带来了多项安全增强:改进的错误处理、类型系统和更严格的类型检查。PHP 8 引入了 match 语句,比 switch 更类型安全。强制类型系统示例:function add(int $a, int $b): int{ return $a + $b; },如果传入 add("5", 10) 将抛出 TypeError。密码哈希算法改进:使用 password_hash($pass, PASSWORD_DEFAULT) 和 password_verify()。
注意事项
1. PHP 8.5 新增的 JsonDecodeError 等异常类型,如果被未捕获的 try/catch 漏掉,仍会触发致命错误(2026 年 3 月 3 日资料)。
2. 错误日志路径权限常被忽视:/var/log/php/error.log 所属用户必须是 www-data(或 PHP-FPM 实际运行用户),且权限不能是 644,否则可能被 Web 进程以外的用户读取。
3. 如果用了 Suhosin 或其他安全扩展,它可能覆盖 php.ini 的设置,得查 phpinfo() 输出的实际值(2026 年 3 月 3 日)。
4. curl_exec 容易被漏掉,它能发起内网请求,配合 SSRF 可打穿内网,生产环境建议一并禁用。
5. 自定义错误页(如 500.html)必须静态化,禁止任何 PHP 解析逻辑,否则可能成为新的注入入口。
6. zend.max_allowed_stack_size 自 PHP 8.3.0 起可用,zend.enable_gc 默认"1",enable_dl 是过时特性,将在未来被移除。
参考来源
来源:PHP 官方运行时配置文档 - assert 相关配置项弃用信息(2026 年 4 月 12 日)
来源:腾讯云开发者社区 - PHP8.5 安全配置有哪些(2026 年 3 月 3 日发布)
来源:阿里云开发者社区 - 提升 PHP 安全:8 个必须修改的 PHP 默认配置(2023 年 1 月 4 日)
来源:PHP 官方会话安全文档 - 会话相关配置项说明(截至 2024 年 4 月 15 日)