PHP项目开源漏洞如何定期扫描依赖包

wen PHP项目 33

本文目录导读:

PHP项目开源漏洞如何定期扫描依赖包

  1. 方案一:使用 Composer 官方审计命令(最推荐,简单高效)
  2. 方案二:集成到 CI/CD 流水线(自动化定期扫描)
  3. 方案三:专业安全工具(更全面,适合中大型团队)
  4. 方案四:离线/内网环境扫描
  5. 方案五:开发阶段实时检查(VSCode 插件)
  6. 推荐组合策略

针对PHP项目的依赖包安全漏洞扫描,目前主要有以下几种成熟且高效的方案,可以根据项目规模和开发流程选择:

使用 Composer 官方审计命令(最推荐,简单高效)

Composer 2.4 版本开始,内置了 audit 命令。

基础扫描

composer audit
  • 它会对比 composer.lock 中的包版本与 FriendsOfPHP/security-advisories 数据库。
  • 如果没有漏洞,返回 0(静默退出);有漏洞会显示详细信息。

格式化输出(适合 CI/CD)

composer audit --format=json
  • 输出 JSON 格式结果,方便 Jenkins、GitLab CI 等工具解析并设置构建失败。

仅检查已安装的包

composer audit --no-dev
  • 生产环境通常只安装 require 中的包,排除 require-dev

自动修复(实验性)

composer audit --fix
  • 尝试将受漏洞影响的包更新到包含修复的最低版本(需要 composer.lock 可写)。

局限性:只能检查 Composer 官方数据库已有的记录,对私有包或自定义漏洞不生效。


集成到 CI/CD 流水线(自动化定期扫描)

在 GitLab CI、GitHub Actions 或 Jenkins 中配置定期任务(例如每天凌晨):

GitLab CI 示例(.gitlab-ci.yml 片段)

security-audit:
  stage: test
  script:
    - composer install --no-dev --prefer-dist
    - composer audit --format=json | tee audit-report.json
  artifacts:
    paths:
      - audit-report.json
    when: always
  only:
    - schedules  # 仅定时触发

GitHub Actions 示例

name: Dependency Audit
on:
  schedule:
    - cron: '0 2 * * *'  # 每天 UTC 2 点
  push:
    branches: [ main ]
jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
      - run: composer install --no-dev
      - run: composer audit --format=json

优点

  1. 自动化无人工干预。
  2. 可以配合 git tag 策略,在发布前强制扫描。

专业安全工具(更全面,适合中大型团队)

当需要覆盖更多漏洞数据库(如 NVD、GitHub Advisory、Snyk)或支持私有组件时,可以使用以下工具:

工具 特点 成本
Snyk CLI 支持 PHP、Java、Node 等;数据库全;可锁定版本 免费版有限制(200测试/月),企业版付费
GitHub Dependabot 自动创建 PR 更新有漏洞的依赖;支持 composer.lock 免费(GitHub 仓库)
GitLab Dependency Scan GitLab Ultimate 内置的扫描器 付费
Syft + Grype 开源工具链,Syft 生成 SBOM,Grype 扫描漏洞 免费

Snyk 示例(适合本地快速扫描)

# 安装
npm install -g snyk
# 认证(需要注册账号)
snyk auth
# 扫描当前项目
snyk test
# 持续监控(在后台持续监控新漏洞)
snyk monitor

Dependabot 配置(./github/dependabot.yml

version: 2
updates:
  - package-ecosystem: "composer"
    directory: "/"
    schedule:
      interval: "daily"
    open-pull-requests-limit: 10

离线/内网环境扫描

如果项目部署在无法访问外网的环境中,可以使用 本地镜像 的方式:

  1. 定期同步漏洞数据库

    git clone https://github.com/FriendsOfPHP/security-advisories.git /local/path/advisories
  2. 本地执行审计(需要 Composer 2.x):

    composer audit --format=json --advisories-dir=/local/path/advisories

注意:需要定期拉取更新该仓库(建议每周)。


开发阶段实时检查(VSCode 插件)

推荐安装 PHP IntelephenseSonarLint,它们可以:

  • composer.json 中实时显示已知漏洞的依赖。
  • 扫描时自动对比本地数据库。

推荐组合策略

场景 推荐方案
个人开发者/小团队 composer audit 手动执行 + Git hook
中大型团队/公司 CI 定时扫描(方案二) + Dependabot 自动 PR
内网/高安全需求 本地镜像 + 手动定期更新
生产环境发布前 composer audit --no-dev --format=json 设置构建门禁

Git hook 示例(在 .git/hooks/pre-commit 中阻止提交含漏洞的依赖)

#!/bin/sh
echo "Running composer audit..."
if composer audit --no-dev; then
    exit 0
else
    echo "Error: Vulnerabilities found. Commit blocked."
    exit 1
fi
  • 最轻量composer audit 命令(零额外依赖)。
  • 最自动化:CI/CD 定时任务 + 构建阻断。
  • 最全面:Snyk / Dependabot / GitLab 企业版。
  • 最安全:离线镜像 + 定期同步。

建议首先启用 方案一composer audit 命令,并集成到 方案二 的 CI 流水线中,这是目前成本最低且效果明显的做法,如果涉及敏感数据或合规要求,再考虑升级到 Snyk 等专业方案。

抱歉,评论功能暂时关闭!