Übung: Verwalten von Updates der Abhängigkeiten im Node.js-Paket

Abgeschlossen

Tailwind Traders hat Sie beauftragt, an einer App mit veralteten Abhängigkeiten zu arbeiten. Die App ist klein und weist nur wenige Abhängigkeiten auf. Das Aktualisieren des Codes sollte einfach sein. Sie werden versuchen, die App zu aktualisieren, damit die neuesten Features verwendet werden können. Währenddessen beheben Sie jegliche Sicherheitsrisiken, die Sie finden.

Erste Schritte

  1. Wechseln Sie in einem neuen Terminalfenster (STRG + UMSCHALT + `) zum Ordner, der die Dateien für diese Übung enthält:

    cd ../7-exercise-dependency-management
    
  2. Installieren Sie die Abhängigkeiten, indem Sie den folgenden Befehl ausführen:

    npm install
    

    Die Ausgabe der installierten Pakete und alle Sicherheitsrisiken sollten angezeigt werden.

  3. Öffnen Sie die Datei „package.json“, und sehen Sie sich den Abschnitt dependencies an.

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

    Beachten Sie, dass die Muster das Einfügezeichen (^) enthalten, das Aktualisierungen der Nebenversion angibt, um Abhängigkeiten zu unterstützen: 1.x.

  4. Öffnen Sie die Datei index.js, um zu verstehen, wie die Paketabhängigkeiten in der App verwendet werden:

    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();
    

    Dieser Code zieht Daten mithilfe des node-fetch-Paket aus einer REST-API. Die Antwort wird verarbeitet, indem diese mithilfe des lodash-Pakets sortiert wird und dann die drei obersten Ergebnisse ausgewählt werden. Das Ergebnis wird in einer Datei gespeichert.

npm-Audit

Führen Sie den folgenden Befehl aus, um zu verstehen, ob Sicherheitsrisiken vorhanden sind:

npm audit

Die Ausgabe sollte folgendem Beispiel entsprechen:

# 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

Die Ausgabe gibt die Sicherheitsanfälligkeiten und die Version des Pakets an, welches das Problem behebt.

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

npm veraltet

Führen Sie im Terminal diesen Befehl aus, um nach veralteten Abhängigkeiten zu suchen:

npm outdated

Die Ausgabe sollte folgendem Beispiel entsprechen:

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

Die aktuellen und erwünschten Versionen sind identisch, aber die neueste Version unterscheidet sich. Die in der package.json angegebene Semantikaktualisierungsstrategie wurde erfüllt, aber die Sicherheitsanfälligkeiten sind weiterhin vorhanden.

npm aktualisieren

  1. Bearbeiten Sie die package.json-Datei explizit, um wichtige Änderungen zu ermöglichen, um die Sicherheitsanfälligkeiten zu beheben, beginnend mit dem erheblicheren Paket:

    "node-fetch": "^2.6.6"
    
  2. Führen Sie diesen Befehl aus, um zu sehen, was das Update bewirken würde:

    npm update --dry-run
    
    added 3 packages, removed 4 packages, and changed 1 package in 508ms
    
  3. Führen Sie diesen Befehl aus, um das Projekt basierend auf package.json zu aktualisieren:

    npm update
    
  4. Führen Sie diesen Befehl aus, um zu sehen, ob die Sicherheitsanfälligkeit für node-fetch behoben wurde:

    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. Wenn Ihr Projekt Tests enthält, führen Sie sie aus, um zu überprüfen, dass das Update keine Störungen verursacht hat.

  6. Führen Sie die gleichen Schritte aus, um lo-dash ohne Sicherheitsrisiken auf die 4.17.20-Version zu aktualisieren.

    Die Sicherheitsanfälligkeiten wurden behoben, aber die node-fetch-Version hängt immer noch eine Hauptversion zurück. Wenn alle Ihre Tests bestanden werden, korrigieren Sie die in der package.json-Datei angegebene Version auf die neueste Version:

    "node-fetch": "^3.3.2"
    
  7. Führen Sie dann den folgenden Befehl aus, um das Projekt zu aktualisieren:

    npm update
    

    Ihr Projekt sollte jetzt keine npm-Sicherheitsrisiken aufweisen und die aktuelle Hauptversion haben.

  8. Überprüfen Sie Ihre package.json- und package-lock.json-Dateien.

    Herzlichen Glückwunsch! Sie haben die Abhängigkeiten aktualisiert und die Sicherheitsrisiken im Projekt behoben.

Bereinigung des Entwicklungscontainers

Nach Abschluss des Projekts können Sie Ihre Entwicklungsumgebung bereinigen oder wieder in den normalen Zustand versetzen.

Durch das Löschen der GitHub Codespaces-Umgebung wird sichergestellt, dass Sie die Anzahl der kostenlosen Berechtigungsstunden pro Kern maximieren können, die Sie für Ihr Konto erhalten.

Wichtig

Weitere Informationen zu den Berechtigungen Ihres GitHub-Kontos finden Sie im Artikel zu monatlich enthaltener Speicherkapazität und Kernstunden in GitHub Codespaces.

  1. Melden Sie sich beim GitHub Codespaces-Dashboard (https://github.com/codespaces) an.

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

  2. Öffnen Sie das Kontextmenü für den Codespace, und wählen Sie Löschen aus.

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