Exercice – Gérer les mises à jour de dépendances dans un projet Node.js
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
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
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.
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
.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 packagelodash
. 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
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"
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
Exécutez cette commande pour mettre à jour le projet en fonction du
package.json
:npm update
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
Si votre projet a des tests, exécutez-les pour vérifier que la mise à jour n’a rien endommagé.
Utilisez ces mêmes étapes pour mettre à jour
lo-dash
vers la version4.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 fichierpackage.json
en indiquant la dernière version :"node-fetch": "^3.3.2"
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.
Archivez vos fichiers
package.json
etpackage-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.
Connectez-vous au tableau de bord GitHub Codespaces (https://github.com/codespaces).
Ouvrez le menu contextuel du codespace et sélectionnez Supprimer.