保持更新
保持 PHP 及其生态系统的更新是安全维护的基础环节。过时的 PHP 版本可能包含已知的安全漏洞,不再接收安全补丁的版本会成为攻击者的主要目标。本节讲解 PHP 版本管理、Composer 依赖安全审计、自动更新策略和安全通告关注等最佳实践。
基础概念
PHP 版本支持周期
PHP 每个主要版本的支持分为三个阶段:
| 阶段 | 时长 | 说明 |
|---|---|---|
| Active Support | 约 2 年 | 修复 Bug 和安全问题,包含新特性 |
| Security Fixes Only | 约 1 年 | 仅修复安全问题 |
| End of Life (EOL) | -- | 停止所有支持 |
关键原则
绝不使用已 EOL 的 PHP 版本。EOL 版本不再接收安全补丁,任何新发现的安全漏洞都不会被修复。
当前 PHP 版本状态(参考)
| 版本 | Active Support 到 | Security Fixes 到 | 状态 |
|---|---|---|---|
| 8.4 | 2026 年 12 月 | 2028 年 12 月 | 最新 |
| 8.3 | 2025 年 11 月 | 2027 年 11 月 | Active |
| 8.2 | 2024 年 12 月 | 2026 年 12 月 | Active |
| 8.1 | 2023 年 11 月 | 2025 年 11 月 | Security Only |
| 8.0 | 2022 年 11 月 | 2023 年 11 月 | EOL |
| 7.4 | 2021 年 11 月 | 2022 年 11 月 | EOL |
实际日期以 PHP 官方公告为准
Composer 依赖安全
审计已知漏洞
bash
# 检查项目依赖中是否有已知安全漏洞
composer audit
# 检查所有依赖(包括开发依赖)
composer audit --all
# 使用 CVE 数据库格式输出
composer audit --format=json
# Composer 2.2+ 自动检查
# composer install 和 composer update 会自动审计检查过时依赖
bash
# 查看哪些依赖有可用更新
composer outdated
# 查看包含安全更新的过时依赖
composer outdated --direct
# 查看所有过时依赖(包括间接依赖)
composer outdated --all
# 查看次要版本和补丁版本的更新
composer outdated --minor-only
composer outdated --patch-only安全相关 Composer 插件
bash
# Roave 安全通告检查(阻止包含已知漏洞的依赖安装)
composer require --dev roave/security-advisories:dev-latest
# PHPStan 静态分析(发现代码安全问题)
composer require --dev phpstan/phpstan
# PHP-CS-Fixer(代码风格检查)
composer require --dev friendsofphp/php-cs-fixer
# PHP_CodeSniffer(编码标准检查)
composer require --dev squizlabs/php_codesniffer
# Psalm(静态分析)
composer require --dev vimeo/psalm服务器安全更新
PHP 版本升级策略
bash
# === 升级前准备 ===
# 1. 确认当前版本
php -v
# 2. 检查当前使用的扩展
php -m
# 3. 备份配置
cp /etc/php.ini /etc/php.ini.bak
cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.bak
# === Ubuntu/Debian ===
sudo apt update
sudo apt install php8.3 php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl
# === CentOS/RHEL ===
sudo dnf install php8.3 php8.3-fpm php8.3-mysqlnd php8.3-mbstring php8.3-xml php8.3-curl
# === 从源码编译 ===
# 下载源码
wget https://www.php.net/distributions/php-8.3.0.tar.gz
tar -xzf php-8.3.0.tar.gz
cd php-8.3.0
# 配置(启用常用扩展)
./configure \
--with-fpm \
--with-mysqli \
--with-pdo-mysql \
--with-mbstring \
--with-curl \
--with-openssl \
--with-zlib \
--enable-mbstring \
--enable-xml \
--enable-bcmath \
--enable-intl \
--enable-opcache
# 编译安装
make -j$(nproc)
sudo make installPECL 扩展更新
bash
# 列出已安装的 PECL 扩展
pecl list
# 查看可升级的扩展
pecl list-upgrades
# 升级指定扩展
pecl upgrade redis
pecl upgrade xdebug
pecl upgrade mongodb
# 卸载旧版本
pecl uninstall old_extensionOPcache 更新注意事项
ini
; 升级 PHP 后更新 OPcache 配置
; php.ini
[opcache]
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=0 ; 生产环境关闭时间戳验证
opcache.validate_timestamps=0 ; 使用文件哈希验证
opcache.save_comments=1
opcache.fast_shutdown=1
opcache.enable_file_override=1自动化安全维护
CI/CD 中的安全检查
yaml
# .github/workflows/security.yml
name: Security Audit
on:
schedule:
- cron: '0 0 * * *' # 每天运行
push:
branches: [main]
pull_request:
branches: [main]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
coverage: none
- name: Install dependencies
run: composer install --prefer-dist --no-progress
- name: Composer audit
run: composer audit
- name: Check for outdated packages
run: composer outdated --direct || true
- name: PHPStan analysis
run: vendor/bin/phpstan analyse src --level=6 --no-progress
- name: PHP-CS-Fixer check
run: vendor/bin/php-cs-fixer fix --dry-run --diff定期安全检查脚本
php
<?php
declare(strict_types=1);
/**
* PHP 环境安全检查脚本
* 建议通过 cron 定期运行
*/
class SecurityChecker
{
public function checkPhpVersion(): array
{
$results = [];
$version = phpversion();
$results[] = ['PHP 版本', $version];
// 检查是否为已 EOL 的版本
$eolVersions = ['7.0', '7.1', '7.2', '7.3', '7.4', '8.0'];
$majorMinor = preg_replace('/^(\d+\.\d+).*/', '$1', $version);
if (in_array($majorMinor, $eolVersions, true)) {
$results[] = ['警告', "PHP {$majorMinor} 已 EOL,请立即升级!"];
}
// 检查关键安全设置
$settings = [
'expose_php' => ['Off', '已隐藏 PHP 签名'],
'display_errors' => ['Off', '关闭错误显示'],
'allow_url_include' => ['Off', '关闭远程包含'],
'session.use_strict_mode' => ['1', 'Session 严格模式'],
];
foreach ($settings as $key => [$expected, $desc]) {
$value = ini_get($key);
$isSecure = $value === $expected;
$results[] = [
$desc . ($isSecure ? ' [OK]' : ' [不安全]'),
"当前: {$value}, 推荐: {$expected}",
];
}
return $results;
}
}
$checker = new SecurityChecker();
foreach ($checker->checkPhpVersion() as $item) {
echo implode(': ', $item) . "\n";
}监控安全通告
关注的安全信息源
php
<?php
// Composer 项目的安全相关配置
// composer.json 中可以添加安全策略
// 使用语义化版本约束
{
"require": {
"php": "^8.2",
"laravel/framework": "^10.0",
"guzzlehttp/guzzle": "^7.0"
},
"config": {
"sort-packages": true,
"preferred-install": "dist",
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
}
}
}
// 使用 ^ 约束(允许补丁和次要版本更新,不允许主版本更新)
// 使用 ~ 约束(仅允许补丁版本更新)
// 使用精确版本(不推荐,难以获取安全修复)关键安全信息来源
| 来源 | URL | 内容 |
|---|---|---|
| PHP 官方安全 | php.net/ChangeLog | PHP 版本安全修复 |
| PHP CVE 数据库 | github.com/php/php-src/security | 安全漏洞详情 |
| Composer 审计 | packagist.org/advisories | PHP 包安全通告 |
| NIST NVD | nvd.nist.gov | 通用漏洞数据库 |
| OWASP | owasp.org | 安全最佳实践 |
| PHP Weekly | phpweekly.com | 每周 PHP 新闻 |
实战示例:自动化安全检查流程
bash
#!/bin/bash
# security-check.sh - 项目安全检查脚本
set -e
echo "=== PHP 安全检查 ==="
echo "PHP 版本: $(php -v | head -1)"
echo ""
echo "=== Composer 审计 ==="
composer audit 2>/dev/null || echo "无 composer audit 支持,尝试其他方式"
echo ""
echo "=== 过时依赖检查 ==="
composer outdated --direct 2>/dev/null || echo "无过时依赖"
echo ""
echo "=== PHPStan 静态分析 ==="
if [ -f "vendor/bin/phpstan" ]; then
vendor/bin/phpstan analyse src --level=6 --no-progress 2>/dev/null || echo "存在分析问题"
else
echo "PHPStan 未安装"
fi
echo ""
echo "=== 安全检查完成 ==="注意事项
1. 升级前的兼容性测试
bash
# 在升级前进行兼容性检查
# PHP 官方提供兼容性报告
# https://php.net/supported-versions.php
# 使用 CI 管道测试新版本
# 1. 在新版本 PHP 上运行测试套件
# 2. 运行静态分析工具
# 3. 进行性能基准测试2. 生产环境升级流程
1. 备份数据库和配置文件
2. 在测试环境升级并测试
3. 运行完整测试套件
4. 选择低流量时段
5. 执行升级(蓝绿部署或滚动更新)
6. 监控错误日志和应用指标
7. 回滚计划(如果出问题)最佳实践
1. 安全维护时间表
每日:
- 监控安全通告
- 检查异常日志
每周:
- 运行 composer audit
- 检查 PHP 官方安全公告
每月:
- 更新 Composer 依赖(补丁版本)
- 审查依赖过时情况
每季度:
- 更新次要版本依赖
- 安全评估报告
每年:
- PHP 版本升级评估
- 全面安全审计下一节
继续学习:RESTful API 设计