Cvičení – správa aktualizací závislostí ve vašem projektu Node.js.

Dokončeno

Ve společnosti Tailwind Traders jste dostali za úkol vyřešit aplikaci s několika zastaralými závislostmi. Aplikace je malá a má jenom několik závislostí. Aktualizace kódu by měla být jednoduchá. Podívejte se, jestli můžete aplikaci aktualizovat tak, aby využívala nejnovější funkce. A když už se do toho pustíte, zkontrolujte ji z hlediska ohrožení zabezpečení a případně ji rovnou opravte.

Začínáme

  1. V novém okně terminálu (Ctrl + Shift + `) přejděte do složky se soubory pro toto cvičení:

    cd ../7-exercise-dependency-management
    
  2. Spuštěním tohoto příkazu nainstalujte závislosti:

    npm install
    

    Měl by se zobrazit výstup o nainstalovaných balíčcích a všech ohroženích zabezpečení.

  3. Otevřete soubor package.json a prohlédněte dependencies si část:

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

    Všimněte si, že vzory určují znak vložení (^), který indikuje aktualizace podverze pro podporu závislostí: 1.x.

  4. Otevřete soubor index.js, abyste pochopili, jak se v aplikaci používají závislosti balíčků:

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

    Tento kód načítá data z rozhraní REST API pomocí node-fetch balíčku. Zpracuje odpověď tím, že ji seřadí a vezme nejlepší tři výsledky pomocí lodash balíčku. Výsledek se uloží do souboru.

npm audit

Pokud chcete zjistit, jestli nedošlo k nějakým ohrožením zabezpečení, spusťte tento příkaz:

npm audit

Měl by se zobrazit výstup podobný tomuto příkladu:

# 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

Výstup uvádí chyby zabezpečení a verzi balíčku, který problém řeší.

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

npm zastaralé

V terminálu spusťte tento příkaz a zkontrolujte zastaralé závislosti:

npm outdated

Měl by se zobrazit výstup podobný tomuto příkladu:

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

Aktuální a požadované verze jsou stejné, ale nejnovější verze se liší. Strategie sémantických aktualizací zadaná v package.json uvedeném seznamu byla splněna, ale ohrožení zabezpečení stále existují.

npm update

  1. package.json Upravte soubor tak, aby explicitně umožňovaly významné změny, které opraví ohrožení zabezpečení, počínaje tím důležitějším balíčkem:

    "node-fetch": "^2.6.6"
    
  2. Spuštěním tohoto příkazu zjistíte, co by aktualizace udělala:

    npm update --dry-run
    
    added 3 packages, removed 4 packages, and changed 1 package in 508ms
    
  3. Spuštěním tohoto příkazu aktualizujte projekt na package.jsonzákladě:

    npm update
    
  4. Spuštěním tohoto příkazu zobrazte chybu zabezpečení, která node-fetch byla opravena:

    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. Pokud má váš projekt nějaké testy, spusťte je a ověřte, že aktualizace nic neporušila.

  6. Stejným postupem aktualizujte lo-dash verzi 4.17.20 bez ohrožení zabezpečení.

    Tato ohrožení zabezpečení jsou opravená, ale node-fetch verze je stále hlavní verzí. Pokud všechny testy projdou, opravte verzi zadanou v package.json souboru na nejnovější verzi:

    "node-fetch": "^3.3.2"
    
  7. Potom spuštěním následujícího příkazu aktualizujte projekt:

    npm update
    

    Váš projekt by teď neměl mít žádné chyby zabezpečení npm a měl by být v aktuální hlavní verzi.

  8. Přihlaste se package.json se změnami a package-lock.json soubory.

    Blahopřejeme! Aktualizovali jste závislosti a opravili jste ohrožení zabezpečení v projektu.

Vyčištění vývojového kontejneru

Po dokončení projektu můžete chtít vyčistit vývojové prostředí nebo ho vrátit do typického stavu.

Odstraněním prostředí GitHub Codespaces zajistíte, že můžete maximalizovat nárok na počet bezplatných hodin za jádro, které získáte pro svůj účet.

Důležité

Další informace o oprávněních účtu GitHub najdete v tématu GitHub Codespaces měsíčně zahrnuté hodiny úložiště a jádra.

  1. Přihlaste se k řídicímu panelu GitHub Codespaces (https://github.com/codespaces).

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

  2. Otevřete místní nabídku pro codespace a vyberte Odstranit.

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