Ćwiczenie — zarządzanie aktualizacjami zależności w projekcie Node.js
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
W nowym oknie terminalu (Ctrl + Shift + `) przejdź do folderu zawierającego pliki dla tego ćwiczenia:
cd ../7-exercise-dependency-management
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.
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
.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życiulodash
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
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"
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
Uruchom to polecenie, aby zaktualizować projekt na podstawie elementu
package.json
:npm update
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
Jeśli projekt ma jakiekolwiek testy, uruchom je, aby sprawdzić, czy aktualizacja nie uległa awarii.
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ą wpackage.json
pliku do najnowszej wersji:"node-fetch": "^3.3.2"
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.
Zaewidencjonuj pliki
package.json
ipackage-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).
Zaloguj się do pulpitu nawigacyjnego usługi GitHub Codespaces (https://github.com/codespaces).
Otwórz menu kontekstowe dla przestrzeni kodu i wybierz pozycję Usuń.