Oefening: Updates van afhankelijkheden in uw Node.js-project beheren

Voltooid

Tailwind Traders heeft u gevraagd om met een app te werken die verouderde afhankelijkheden heeft. De app is klein en heeft slechts enkele afhankelijkheden. Het bijwerken van de code moet eenvoudig zijn. Controleer of u de app kunt bijwerken om te profiteren van de nieuwste functies. En nu u toch bezig bent kunt u beveiligingsproblemen ook meteen oplossen, mocht u ze tegenkomen.

Aan de slag

  1. Ga in een nieuw terminalvenster (Ctrl + Shift + `) naar de map met de bestanden voor deze oefening:

    cd ../7-exercise-dependency-management
    
  2. Installeer de afhankelijkheden door deze opdracht uit te voeren:

    npm install
    

    Als het goed is, ziet u uitvoer over de geïnstalleerde pakketten en eventuele beveiligingsproblemen.

  3. Open het bestand package.json en bekijk de dependencies sectie:

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

    U ziet dat in de patronen het invoegteken (^) wordt opgegeven, waarmee updates voor de secundaire versie worden aangegeven ter ondersteuning van afhankelijkheden: 1.x.

  4. Open het bestand index.js om te begrijpen hoe de pakketafhankelijkheden worden gebruikt in de 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();
    

    Met deze code worden gegevens opgehaald uit een REST API met behulp van het node-fetch pakket. Het antwoord wordt verwerkt door het te sorteren en de drie belangrijkste resultaten te gebruiken met behulp van het lodash pakket. Het resultaat wordt opgeslagen in een bestand.

npm-controle

Als u wilt weten of er beveiligingsproblemen zijn, voert u deze opdracht uit:

npm audit

De uitvoer moet er ongeveer uitzien als in dit voorbeeld:

# 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

In de uitvoer worden de beveiligingsproblemen en de versie van het pakket vermeld waarmee het probleem wordt opgelost.

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

npm verouderd

Voer in de terminal deze opdracht uit om te controleren op verouderde afhankelijkheden:

npm outdated

De uitvoer moet er ongeveer uitzien als in dit voorbeeld:

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

De huidige en gewenste versies zijn hetzelfde, maar de nieuwste versie is anders. Er is voldaan aan de semantische updatestrategie die in de package.json strategie is opgegeven, maar de beveiligingsproblemen bestaan nog steeds.

npm-update

  1. Bewerk het package.json bestand zodat belangrijke wijzigingen expliciet de beveiligingsproblemen kunnen oplossen, te beginnen met het belangrijkere pakket:

    "node-fetch": "^2.6.6"
    
  2. Voer deze opdracht uit om te zien wat de update zou doen:

    npm update --dry-run
    
    added 3 packages, removed 4 packages, and changed 1 package in 508ms
    
  3. Voer deze opdracht uit om het project bij te werken op basis van het package.jsonvolgende:

    npm update
    
  4. Voer deze opdracht uit om te zien of het beveiligingsprobleem node-fetch is opgelost:

    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. Als uw project tests heeft, voert u deze uit om te controleren of de update niets heeft verbroken.

  6. Gebruik dezelfde stappen om bij te werken lo-dash naar de 4.17.20 versie zonder beveiligingsproblemen.

    De beveiligingsproblemen zijn opgelost, maar de node-fetch versie is nog steeds een primaire versie. Als al uw tests zijn geslaagd, corrigeert u de versie die in het package.json bestand is opgegeven naar de nieuwste versie:

    "node-fetch": "^3.3.2"
    
  7. Voer vervolgens de volgende opdracht uit om het project bij te werken:

    npm update
    

    Uw project moet nu geen npm-beveiligingsproblemen hebben en de huidige primaire versie hebben.

  8. Controleer uw package.json en package-lock.json bestanden.

    Gefeliciteerd. U hebt de afhankelijkheden bijgewerkt en de beveiligingsproblemen in het project opgelost.

Ontwikkelcontainer opschonen

Nadat u het project hebt voltooid, kunt u uw ontwikkelomgeving opschonen of teruggaan naar de typische status.

Als u de GitHub Codespaces-omgeving verwijdert, zorgt u ervoor dat u de hoeveelheid gratis rechten per kernuren kunt maximaliseren die u voor uw account krijgt.

Belangrijk

Zie GitHub Codespaces maandelijks inbegrepen opslag- en kernuren voor meer informatie over de rechten van uw GitHub-account.

  1. Meld u aan bij het GitHub Codespaces-dashboard (https://github.com/codespaces).

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

  2. Open het contextmenu voor de coderuimte en selecteer Verwijderen.

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