Ćwiczenie — zarządzanie aktualizacjami zależności w projekcie Node.js

Ukończone

Firma Tailwind Traders zleciła Ci pracę nad aplikacją z pewnymi nieaktualnymi zależnościami. Aplikacja jest mała i ma tylko kilka zależności. Aktualizowanie kodu powinno być proste. Sprawdź, czy możesz zaktualizować tę aplikację, aby korzystać z najnowszych funkcji. Jeśli przy tym znajdziesz jakiekolwiek luki w zabezpieczeniach, usuń je.

Rozpocznij

  1. W nowym oknie terminalu (Ctrl + Shift + `) przejdź do folderu zawierającego pliki dla tego ćwiczenia:

    cd ../7-exercise-dependency-management
    
  2. Zainstaluj zależności, uruchamiając następujące polecenie:

    npm install
    

    Powinny zostać wyświetlone dane wyjściowe dotyczące zainstalowanych pakietów i wszelkich luk w zabezpieczeniach.

  3. Otwórz plik package.json i zapoznaj się z sekcją dependencies :

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

    Zwróć uwagę, że wzorce określają znak wstawiania (^), który wskazuje aktualizacje wersji pomocniczej w celu obsługi zależności: 1.x.

  4. Otwórz plik index.js, aby dowiedzieć się, jak zależności pakietów są używane w aplikacji:

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

    Ten kod pobiera dane z interfejsu node-fetch API REST przy użyciu pakietu. Przetwarza odpowiedź, sortując ją i pobiera trzy pierwsze wyniki przy użyciu lodash pakietu. Wynik zostaje zapisany w pliku.

Inspekcja npm

Aby dowiedzieć się, czy istnieją jakiekolwiek luki w zabezpieczeniach, uruchom następujące polecenie:

npm audit

Powinny zostać wyświetlone dane wyjściowe podobne do tego przykładu:

# 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

Dane wyjściowe zawierają luki w zabezpieczeniach i wersję pakietu, który rozwiązuje problem.

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

npm nieaktualne

W terminalu uruchom następujące polecenie, aby sprawdzić nieaktualne zależności:

npm outdated

Powinny zostać wyświetlone dane wyjściowe podobne do tego przykładu:

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

Bieżące i poszukiwane wersje są takie same, ale najnowsza wersja jest inna. Strategia aktualizacji semantycznej określona w obiekcie package.json została spełniona, ale luki w zabezpieczeniach nadal istnieją.

Aktualizacja narzędzia npm

  1. Edytuj plik, package.json aby jawnie umożliwiał wprowadzenie istotnych zmian w celu naprawienia luk w zabezpieczeniach, począwszy od bardziej znaczącego pakietu:

    "node-fetch": "^2.6.6"
    
  2. Uruchom to polecenie, aby zobaczyć, co zrobiłaby aktualizacja:

    npm update --dry-run
    
    added 3 packages, removed 4 packages, and changed 1 package in 508ms
    
  3. Uruchom to polecenie, aby zaktualizować projekt na podstawie elementu package.json:

    npm update
    
  4. Uruchom to polecenie, aby zobaczyć, że usunięto lukę w zabezpieczeniach node-fetch :

    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. Jeśli projekt ma jakiekolwiek testy, uruchom je, aby sprawdzić, czy aktualizacja nie uległa awarii.

  6. Wykonaj te same kroki, aby zaktualizować lo-dash 4.17.20 wersję bez luk w zabezpieczeniach.

    Luki w zabezpieczeniach zostały naprawione, ale node-fetch wersja jest nadal wersją główną. Jeśli wszystkie testy zostały wykonane, popraw wersję określoną w package.json pliku do najnowszej wersji:

    "node-fetch": "^3.3.2"
    
  7. Następnie uruchom następujące polecenie, aby zaktualizować projekt:

    npm update
    

    Projekt powinien teraz nie mieć luk w zabezpieczeniach npm i być w bieżącej wersji głównej.

  8. Zaewidencjonuj pliki package.json i package-lock.json .

    Gratulacje! Zaktualizowano zależności i usunięto luki w zabezpieczeniach w projekcie.

Oczyszczanie kontenera deweloperskiego

Po ukończeniu projektu możesz wyczyścić środowisko deweloperskie lub przywrócić go do jego typowego stanu.

Usunięcie środowiska Usługi GitHub Codespaces gwarantuje, że możesz zmaksymalizować ilość bezpłatnych godzin na godziny korzystania z konta.

Ważne

Aby uzyskać więcej informacji na temat uprawnień konta usługi GitHub, zobacz Artykuł GitHub Codespaces monthly included storage and core hours (Miesięczne miejsca do magazynowania i godzin rdzeni w usłudze GitHub).

  1. Zaloguj się do pulpitu nawigacyjnego usługi GitHub Codespaces (https://github.com/codespaces).

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

  2. Otwórz menu kontekstowe dla przestrzeni kodu i wybierz pozycję Usuń.

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