Esercizio - Gestire gli aggiornamenti delle dipendenze nel progetto Node.js
Si è stati incaricati da Tailwind Traders di lavorare a un'app con alcune dipendenze non aggiornate. L'app è abbastanza piccola e ha solo alcune dipendenze. L'aggiornamento del codice deve essere semplice. Vale la pena verificare se è possibile aggiornare l'app per sfruttare i vantaggi delle funzionalità più recenti. Durante il lavoro sarà possibile correggere eventuali vulnerabilità.
Introduzione
In una nuova finestra del terminale (CTRL + MAIUSC + `) passare alla cartella con i file clonati per questo esercizio:
cd ../7-exercise-dependency-management
Installare le dipendenze eseguendo questo comando:
npm install
Verrà visualizzato l'output sui pacchetti installati e sulle eventuali vulnerabilità.
Aprire il file package.json e trovare la sezione
dependencies
:"lodash": "^1.1.0", "node-fetch": "^1.0.2"
Si noti che i modelli specificano il carattere di inserimento (^), che indica gli aggiornamenti alla versione secondaria per supportare le dipendenze:
1.x
.Aprire il file index.js per comprendere come vengono usate le dipendenze del pacchetto nell'app:
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();
Questo codice esegue il pull dei dati da un'API REST usando il
node-fetch
pacchetto . Elabora la risposta ordinandola e accetta i primi tre risultati usando illodash
pacchetto. Il risultato viene archiviato in un file.
Controllo npm
Per comprendere se sono presenti vulnerabilità, eseguire questo comando:
npm audit
L'output visualizzato sarà simile all'esempio seguente:
# 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
L'output indica le vulnerabilità e la versione del pacchetto che risolve il problema.
Will install lodash@4.17.21, which is a breaking change
Will install node-fetch@3.3.2, which is a breaking change
npm obsoleto
Nel terminale eseguire questo comando per verificare la presenza di dipendenze obsolete:
npm outdated
L'output visualizzato sarà simile all'esempio seguente:
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
Le versioni correnti e desiderate sono le stesse, ma la versione più recente è diversa. La strategia di aggiornamento semantico specificata in package.json
è stata soddisfatta, ma le vulnerabilità esistono ancora.
npm update
Modificare il
package.json
file in modo esplicito consente di apportare modifiche importanti per correggere le vulnerabilità a partire dal pacchetto più significativo:"node-fetch": "^2.6.6"
Eseguire questo comando per visualizzare le operazioni di aggiornamento seguenti:
npm update --dry-run
added 3 packages, removed 4 packages, and changed 1 package in 508ms
Eseguire questo comando per aggiornare il progetto in base a
package.json
:npm update
Eseguire questo comando per visualizzare la vulnerabilità per
node-fetch
è stata risolta: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
Se nel progetto sono presenti test, eseguirli per verificare che l'aggiornamento non abbia interrotto nulla.
Usare questi stessi passaggi per eseguire l'aggiornamento
lo-dash
alla4.17.20
versione senza vulnerabilità.Le vulnerabilità sono corrette, ma la
node-fetch
versione è ancora una versione principale dietro. Se tutti i test superano, correggere la versione specificata nelpackage.json
file alla versione più recente:"node-fetch": "^3.3.2"
Eseguire quindi il comando seguente per aggiornare il progetto:
npm update
Il progetto dovrebbe ora non avere vulnerabilità npm e trovarsi nella versione principale corrente.
Archiviare i
package.json
file epackage-lock.json
.Congratulazioni. Sono state aggiornate le dipendenze e sono state corrette le vulnerabilità nel progetto.
Pulire il contenitore di sviluppo
Dopo aver completato il progetto, è possibile scegliere di pulire l'ambiente di sviluppo o riportarlo allo stato tipico.
L'eliminazione dell'ambiente GitHub Codespaces offre la possibilità di aumentare le ore gratuite per core a cui si ha diritto per l'account.
Importante
Per altre informazioni sui diritti dell'account GitHub, vedere Ore di archiviazione e di core mensili incluse in GitHub Codespaces.
Accedere al dashboard di GitHub Codespaces (https://github.com/codespaces).
Aprire il menu di scelta rapida per il codespace e scegliere Elimina.