Esercizio - Gestire gli aggiornamenti delle dipendenze nel progetto Node.js

Completato

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

  1. In una nuova finestra del terminale (CTRL + MAIUSC + `) passare alla cartella con i file clonati per questo esercizio:

    cd ../7-exercise-dependency-management
    
  2. Installare le dipendenze eseguendo questo comando:

    npm install
    

    Verrà visualizzato l'output sui pacchetti installati e sulle eventuali vulnerabilità.

  3. 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.

  4. 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 il lodash 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

  1. 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"
    
  2. 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
    
  3. Eseguire questo comando per aggiornare il progetto in base a package.json:

    npm update
    
  4. 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
    
  5. Se nel progetto sono presenti test, eseguirli per verificare che l'aggiornamento non abbia interrotto nulla.

  6. Usare questi stessi passaggi per eseguire l'aggiornamento lo-dash alla 4.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 nel package.json file alla versione più recente:

    "node-fetch": "^3.3.2"
    
  7. 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.

  8. Archiviare i package.json file e package-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.

  1. Accedere al dashboard di GitHub Codespaces (https://github.com/codespaces).

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

  2. Aprire il menu di scelta rapida per il codespace e scegliere Elimina.

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