Gestion des dépendances : Audit de sécurité et mises à jour

devops
securite
php
javascript
laravel
tutorial
Author

Sylvain Pham

Published

December 27, 2025

Guide complet pour auditer et mettre à jour les dépendances d’un projet Laravel/React (ou tout projet PHP/JS).

Vue d’ensemble

┌─────────────────────────────────────────────────────────────────────────────┐
│                           AUDIT SECURITE                                    │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   composer audit          npm audit              trivy fs .                 │
│        │                      │                       │                     │
│        ▼                      ▼                       ▼                     │
│   ┌──────────┐          ┌──────────┐          ┌─────────────┐               │
│   │ PHP      │          │ JS       │          │ PHP + JS +  │               │
│   │ packages │          │ packages │          │ Dockerfiles │               │
│   └──────────┘          └──────────┘          │ + secrets   │               │
│                                               └─────────────┘               │
│                                                                             │
│   Intégré               Intégré               A installer                   │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

Partie 1 : Audit de sécurité

Outils intégrés (aucune installation)

# PHP - scan composer.lock
composer audit

# JS - scan package-lock.json
npm audit

Ces commandes sont intégrées nativement. Elles analysent les fichiers .lock et signalent les vulnérabilités connues (CVE).

Trivy : le scanner complet

Trivy est un scanner open-source d’Aqua Security. Il détecte les vulnérabilités dans :

  • Dépendances PHP/JS
  • Images Docker
  • Fichiers de config (Dockerfile, K8s)
  • Secrets exposés

Utilisation via Docker

# Scanner le projet
docker run --rm -v $(pwd):/app aquasec/trivy fs /app

# HIGH/CRITICAL seulement
docker run --rm -v $(pwd):/app aquasec/trivy fs --severity HIGH,CRITICAL /app

# Scanner une image Docker
docker run --rm aquasec/trivy image mon-image:tag

# Ignorer les vulnérabilités sans fix disponible
docker run --rm -v $(pwd):/app aquasec/trivy fs --ignore-unfixed /app

Exemple de sortie

composer.lock (composer)
========================
Total: 1 (HIGH: 1, CRITICAL: 0)

┌───────────────────┬────────────────┬──────────┬─────────┬─────────────────┐
│      Library      │ Vulnerability  │ Severity │ Version │  Fixed Version  │
├───────────────────┼────────────────┼──────────┼─────────┼─────────────────┤
│ laravel/framework │ CVE-2024-XXXXX │ HIGH     │ 12.0.0  │ 12.0.1          │
└───────────────────┴────────────────┴──────────┴─────────┴─────────────────┘

Interpréter les résultats

Colonne Signification
Library Package vulnérable
Vulnerability Identifiant CVE (lien vers détails)
Severity CRITICAL > HIGH > MEDIUM > LOW
Status fixed = un correctif existe
Installed Version Version actuellement installée
Fixed Version Version à installer pour corriger

Quand agir ?

┌─────────────────────────────────────────────────────────────────────────────┐
│                      DOIS-JE CORRIGER ?                                     │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  Le fichier vulnérable est-il dans vendor/ ou node_modules/ ?              │
│        │                                                                    │
│        ├── OUI ──► Est-ce du code exécuté par l'app ?                       │
│        │               │                                                    │
│        │               ├── NON (docs/, tests/) ──► IGNORER                  │
│        │               │                                                    │
│        │               └── OUI ──► Severity ?                               │
│        │                              │                                     │
│        │                              ├── CRITICAL/HIGH ──► CORRIGER        │
│        │                              │                                     │
│        │                              └── MEDIUM/LOW ──► Évaluer le risque  │
│        │                                                                    │
│        └── NON (ton code) ──► CORRIGER                                      │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

Faux positifs courants

Fichier Pourquoi c’est un faux positif
vendor/*/docs/requirements.txt Fichiers Python pour générer la doc, pas exécutés
vendor/*/tests/* Code de test du mainteneur, pas en production
node_modules/*/example/* Exemples, pas utilisés par ton app

Exclure les faux positifs

# Exclure vendor/ et node_modules/
docker run --rm -v $(pwd):/app aquasec/trivy fs --skip-dirs vendor,node_modules /app

# Exclure des fichiers spécifiques
docker run --rm -v $(pwd):/app aquasec/trivy fs --skip-files "vendor/mockery/mockery/docs/requirements.txt" /app

# Fichier .trivyignore (à la racine du projet)
echo "# Faux positif - fichier non exécuté
CVE-2024-XXXXX" > .trivyignore

Partie 2 : Mise à jour des dépendances

┌─────────────────────────────────────────────────────────────────────────────┐
│                              MISE A JOUR                                    │
├─────────────────────────────────┬───────────────────────────────────────────┤
│            SAFE                 │                 FULL                      │
│   (garde les vieilles           │   (met à jour .json avec                  │
│    contraintes dans .json)      │    les dernières versions)                │
├─────────────────────────────────┼───────────────────────────────────────────┤
│                                 │                                           │
│  composer update                │  composer bump                            │
│        │                        │        │                                  │
│        ▼                        │        ▼                                  │
│  ┌──────────────┐               │  ┌──────────────┐    ┌──────────────┐     │
│  │ .lock seul   │               │  │ composer.json│ +  │    .lock     │     │
│  └──────────────┘               │  └──────────────┘    └──────────────┘     │
│                                 │                                           │
├─────────────────────────────────┼───────────────────────────────────────────┤
│                                 │                                           │
│  npm update                     │  npx npm-check-updates -u                 │
│        │                        │        │                                  │
│        ▼                        │        ▼                                  │
│  ┌──────────────┐               │  ┌──────────────┐                         │
│  │ .lock seul   │               │  │ package.json │  (modifié)              │
│  └──────────────┘               │  └──────────────┘                         │
│                                 │        │                                  │
│                                 │        ▼                                  │
│                                 │  npm install                              │
│                                 │        │                                  │
│                                 │        ▼                                  │
│                                 │  ┌──────────────┐                         │
│                                 │  │    .lock     │                         │
│                                 │  └──────────────┘                         │
└─────────────────────────────────┴───────────────────────────────────────────┘

Vérifier les versions obsolètes

# Composer - packages PHP outdated
composer outdated

# npm - packages JS outdated
npm outdated

Mise à jour SAFE (dans les contraintes existantes)

Ces commandes mettent à jour sans modifier composer.json / package.json. Elles respectent les contraintes de version (ex: ^12.0 reste en 12.x).

# PHP
composer update

# JS
npm update

Seuls les fichiers .lock sont modifiés.

Mise à jour FULL (dernières versions majeures)

npm

# 1. Voir les mises à jour disponibles
npx npm-check-updates

# 2. Mettre à jour package.json vers les dernières versions
npx npm-check-updates -u

# 3. Installer les nouvelles versions
npm install

Options utiles de npm-check-updates :

# Mettre à jour uniquement les devDependencies
npx npm-check-updates -u --dep dev

# Mettre à jour uniquement les dependencies
npx npm-check-updates -u --dep prod

# Exclure certains packages
npx npm-check-updates -u --reject "react,react-dom"

# Mode interactif (choisir package par package)
npx npm-check-updates -u --interactive

Composer

# 1. Voir les dernières versions
composer outdated --direct

# 2. Mettre à jour composer.json avec les versions actuellement installées
composer bump

# 3. Pour un package spécifique vers une nouvelle version majeure
composer require laravel/framework:^12.0

composer bump met à jour les contraintes dans composer.json pour correspondre aux versions installées dans composer.lock.

Exemple : "^12.0" devient "^12.5" si 12.5 est installé.

npm-check-updates vs audit fix

npm-check-updates -u npm audit fix --force
But Dernières versions Corriger les failles
Scope Tous les packages Packages vulnérables only
Logique “Je veux le plus récent” “Je veux être secure”

Exemple :

Package npm-check-updates audit fix
react 18.0 → 19.2 OUI NON (pas vulnérable)
lodash 4.17.20 → 4.17.21 OUI OUI (CVE corrigé)

Corriger les vulnérabilités

# PHP - mettre à jour le package vulnérable
composer update vendor/package

# JS - correction automatique (si possible)
npm audit fix

# JS - forcer les corrections (peut casser des choses)
npm audit fix --force

Après une mise à jour majeure

# Vérifier que tout fonctionne
npm run build
npm run types
php artisan test

# Si problèmes de cache
php artisan cache:clear
php artisan config:clear
php artisan view:clear

Partie 3 : Intégration CI/CD

GitHub Actions

# .github/workflows/security.yml
name: Security Scan

on:
  push:
    branches: [main]
  schedule:
    - cron: '0 0 * * *'

jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: composer audit
      - run: npm audit
      - uses: aquasecurity/trivy-action@master
        with:
          scan-type: 'fs'
          severity: 'HIGH,CRITICAL'
          exit-code: '1'

GitLab CI

# .gitlab-ci.yml
security-scan:
  stage: test
  image: docker:latest
  services:
    - docker:dind
  script:
    - composer audit
    - npm audit
    - docker run --rm -v $(pwd):/app aquasec/trivy fs --severity HIGH,CRITICAL --exit-code 1 /app
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
    - if: $CI_PIPELINE_SOURCE == "schedule"

Gitea Actions

# .gitea/workflows/security.yml
name: Security Scan

on:
  push:
    branches: [main]

jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: composer audit
      - run: npm audit
      - run: docker run --rm -v $(pwd):/app aquasec/trivy fs --severity HIGH,CRITICAL --exit-code 1 /app

Bonnes pratiques

  1. Commiter avant de mettre à jour (git commit)
  2. Lire les changelogs pour les mises à jour majeures
  3. Tester après chaque mise à jour (npm run build, php artisan test)
  4. Une mise à jour à la fois pour les packages critiques (Laravel, React, Inertia)
  5. Automatiser les scans de sécurité en CI/CD