Skip to content

保持更新

保持 PHP 及其生态系统的更新是安全维护的基础环节。过时的 PHP 版本可能包含已知的安全漏洞,不再接收安全补丁的版本会成为攻击者的主要目标。本节讲解 PHP 版本管理、Composer 依赖安全审计、自动更新策略和安全通告关注等最佳实践。

前置知识

阅读本节前,建议先了解:安全总则PHP 版本历史

基础概念

PHP 版本支持周期

PHP 每个主要版本的支持分为三个阶段:

阶段时长说明
Active Support约 2 年修复 Bug 和安全问题,包含新特性
Security Fixes Only约 1 年仅修复安全问题
End of Life (EOL)--停止所有支持

关键原则

绝不使用已 EOL 的 PHP 版本。EOL 版本不再接收安全补丁,任何新发现的安全漏洞都不会被修复。

当前 PHP 版本状态(参考)

版本Active Support 到Security Fixes 到状态
8.42026 年 12 月2028 年 12 月最新
8.32025 年 11 月2027 年 11 月Active
8.22024 年 12 月2026 年 12 月Active
8.12023 年 11 月2025 年 11 月Security Only
8.02022 年 11 月2023 年 11 月EOL
7.42021 年 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 install

PECL 扩展更新

bash
# 列出已安装的 PECL 扩展
pecl list

# 查看可升级的扩展
pecl list-upgrades

# 升级指定扩展
pecl upgrade redis
pecl upgrade xdebug
pecl upgrade mongodb

# 卸载旧版本
pecl uninstall old_extension

OPcache 更新注意事项

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/ChangeLogPHP 版本安全修复
PHP CVE 数据库github.com/php/php-src/security安全漏洞详情
Composer 审计packagist.org/advisoriesPHP 包安全通告
NIST NVDnvd.nist.gov通用漏洞数据库
OWASPowasp.org安全最佳实践
PHP Weeklyphpweekly.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 设计

参考链接