Exercice – Gérer les mises à jour de dépendances dans un projet Node.js

Effectué

Tailwind Traders vous a chargé de travailler sur une application qui a plusieurs dépendances obsolètes. L’application est petite et comporte peu de dépendances. La mise à jour du code doit en principe être simple. Regardez si vous pouvez mettre à jour l’application pour tirer parti des fonctionnalités les plus récentes. Pendant que vous y êtes, si vous trouvez des vulnérabilités, corrigez-les.

Démarrage

  1. Dans votre fenêtre de terminal (Ctrl + Shift + `, accédez au dossier qui contient les fichiers clonés pour cet exercice :

    cd ../7-exercise-dependency-management
    
  2. Installez les dépendances en exécutant cette commande :

    npm install
    

    Vous devez voir la sortie sur les packages installés et sur les vulnérabilités.

  3. Ouvrez le fichier package.json et recherchez la section dependencies :

    "lodash": "^1.1.0",
    "node-fetch": "^1.0.2"
    

    Notez que les modèles spécifient le caractère d’insertion (^), qui indique des mises à jour vers la version mineure pour prendre en charge des dépendances : 1.x.

  4. Ouvrez le fichier index.js pour comprendre comment les dépendances du package sont utilisées dans l’application :

    const fetch = require('node-fetch')
    const _ = require('lodash');
    const path = require('path');
    const fs = require('fs');
    
    async function run() {
      const response = await fetch("https://dev.to/api/articles?state=rising");
      const json = await response.json();
      const sorted = _.sortBy(json, ["public_reactions_count"], ['desc']);
      const top3 = _.take(sorted, 3);
    
      const filePrefix = new Date().toISOString().split('T')[0];
      fs.writeFileSync(path.join(__dirname, `${filePrefix}-feed.json`), JSON.stringify(top3, null, 2));
    }
    
    run();
    

    Ce code extrait des données d’une API REST en utilisant le package node-fetch. Il traite la réponse en effectuant un tri et il prend les trois premiers résultats en utilisant le package lodash. Le résultat est stocké dans un fichier.

npm audit

Pour comprendre s’il existe des vulnérabilités, exécutez cette commande :

npm audit

La sortie doit ressembler à cet exemple :

# npm audit report

lodash  <=4.17.20
Severity: critical
Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-x5rq-j2xg-h7qm
Prototype Pollution in lodash - https://github.com/advisories/GHSA-fvqr-27wr-82fm
Prototype Pollution in lodash - https://github.com/advisories/GHSA-jf85-cpcp-j695
Command Injection in lodash - https://github.com/advisories/GHSA-35jh-r3h4-6jhm
Prototype Pollution in lodash - https://github.com/advisories/GHSA-4xc9-xhrj-v574
Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-29mw-wpgm-hmr9
fix available via `npm audit fix --force`
Will install lodash@4.17.21, which is a breaking change
node_modules/lodash

node-fetch  <=2.6.6
Severity: high
The `size` option isn't honored after following a redirect in node-fetch - https://github.com/advisories/GHSA-w7rc-rwvf-8q5r
node-fetch forwards secure headers to untrusted sites - https://github.com/advisories/GHSA-r683-j2x4-v87g
fix available via `npm audit fix --force`
Will install node-fetch@3.3.2, which is a breaking change
node_modules/node-fetch

2 vulnerabilities (1 high, 1 critical)

To address all issues (including breaking changes), run:
npm audit fix --force

La sortie indique les vulnérabilités et la version du package qui résout le problème.

Will install lodash@4.17.21, which is a breaking change
Will install node-fetch@3.3.2, which is a breaking change

npm outdated

Dans le terminal, exécutez cette commande pour rechercher les dépendances obsolètes :

npm outdated

La sortie doit ressembler à cet exemple :

Package     Current  Wanted   Latest  Location                 Depended by
lodash        1.3.1   1.3.1  4.17.21  node_modules/lodash      7-exercise-dependency-management
node-fetch    1.7.3   1.7.3    3.3.2  node_modules/node-fetch  7-exercise-dependency-management

Les versions actuelles et souhaitées sont identiques, mais la dernière version est différente. La stratégie de mise à jour sémantique spécifiée dans le fichier package.json a été satisfaite, mais les vulnérabilités existent toujours.

npm update

  1. Modifiez le fichier package.json pour autoriser explicitement les modifications majeures destinées à corriger les vulnérabilités en commençant par le package plus significatif :

    "node-fetch": "^2.6.6"
    
  2. Exécutez cette commande pour voir ce que ferait la mise à jour :

    npm update --dry-run
    
    added 3 packages, removed 4 packages, and changed 1 package in 508ms
    
  3. Exécutez cette commande pour mettre à jour le projet en fonction du package.json :

    npm update
    
  4. Exécutez cette commande pour voir si la vulnérabilité pour node-fetch été corrigée :

    npm audit
    
    # npm audit report
    
    lodash  <=4.17.20
    Severity: critical
    Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-x5rq-j2xg-h7qm
    Prototype Pollution in lodash - https://github.com/advisories/GHSA-fvqr-27wr-82fm
    Prototype Pollution in lodash - https://github.com/advisories/GHSA-jf85-cpcp-j695
    Command Injection in lodash - https://github.com/advisories/GHSA-35jh-r3h4-6jhm
    Prototype Pollution in lodash - https://github.com/advisories/GHSA-4xc9-xhrj-v574
    Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-29mw-wpgm-hmr9
    fix available via `npm audit fix --force`
    Will install lodash@4.17.21, which is a breaking change
    node_modules/lodash
    
    1 critical severity vulnerability
    
    To address all issues (including breaking changes), run:
      npm audit fix --force
    
  5. Si votre projet a des tests, exécutez-les pour vérifier que la mise à jour n’a rien endommagé.

  6. Utilisez ces mêmes étapes pour mettre à jour lo-dash vers la version 4.17.20 sans vulnérabilités.

    Les vulnérabilités sont corrigées, mais la version de node-fetch est toujours à une version majeure antérieure. Si tous vos tests réussissent, corrigez la version spécifiée dans le fichier package.json en indiquant la dernière version :

    "node-fetch": "^3.3.2"
    
  7. Exécutez ensuite la commande suivante pour mettre à jour le projet :

    npm update
    

    Votre projet doit maintenant ne pas avoir de vulnérabilités npm et être dans la version majeure actuelle.

  8. Archivez vos fichierspackage.json et package-lock.json.

    Félicitations ! Vous avez mis à jour les dépendances et corrigé les vulnérabilités dans le projet.

Nettoyer le conteneur de développement

Une fois le projet terminé, vous souhaiterez peut-être nettoyer votre environnement de développement ou le ramener à son état normal.

La suppression de l’environnement GitHub Codespaces vous permet d’optimiser le nombre d’heures gratuites par cœur que vous obtenez pour votre compte.

Important

Pour plus d’informations sur les droits de votre compte GitHub, consultez GitHub Codespaces mensuel inclus stockage et heures principales.

  1. Connectez-vous au tableau de bord GitHub Codespaces (https://github.com/codespaces).

    Screenshot of all the running codespaces including their status and templates.

  2. Ouvrez le menu contextuel du codespace et sélectionnez Supprimer.

    Screenshot of the context menu for a single codespace with the delete option highlighted.