Exercício – Gerir atualizações de dependência no seu projeto Node.js

Concluído

A Tailwind Traders pediu-lhe para trabalhar numa aplicação que tem algumas dependências desatualizadas. O aplicativo é pequeno e tem apenas algumas dependências. A atualização do código deve ser simples. Veja se pode atualizar a aplicação para usufruir das novas funcionalidades. Enquanto o faz, corrija as vulnerabilidades que encontrar.

Introdução

  1. Em uma nova janela do terminal (Ctrl + Shift + `), mude para a pasta que contém os arquivos para este exercício:

    cd ../7-exercise-dependency-management
    
  2. Instale as dependências ao executar este comando:

    npm install
    

    Você deve ver a saída sobre os pacotes instalados e quaisquer vulnerabilidades.

  3. Abra o arquivo package.json e veja a dependencies seção:

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

    Observe que os padrões especificam o caractere insert (^), que indica atualizações para a versão secundária para suportar dependências: 1.x.

  4. Abra o arquivo index.js para entender como as dependências do pacote são usadas no aplicativo:

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

    Esse código extrai dados de uma API REST usando o node-fetch pacote. Ele processa a resposta classificando-a e obtém os três primeiros resultados usando o lodash pacote. O resultado é armazenado num ficheiro.

Auditoria NPM

Para entender se há vulnerabilidades, execute este comando:

npm audit

Você deve ver uma saída semelhante a este exemplo:

# 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

A saída indica as vulnerabilidades e a versão do pacote que corrige o problema.

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

npm desatualizado

No terminal, execute este comando para verificar se há dependências desatualizadas:

npm outdated

Você deve ver uma saída semelhante a este exemplo:

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

As versões atual e desejada são as mesmas, mas a versão mais recente é diferente. A estratégia de atualização semântica especificada no package.json foi atendida, mas as vulnerabilidades ainda existem.

Atualização do NPM

  1. Edite o arquivo para permitir explicitamente alterações importantes para corrigir as vulnerabilidades, começando com o package.json pacote mais significativo:

    "node-fetch": "^2.6.6"
    
  2. Execute este comando para ver o que a atualização faria:

    npm update --dry-run
    
    added 3 packages, removed 4 packages, and changed 1 package in 508ms
    
  3. Execute este comando para atualizar o projeto com base no package.json:

    npm update
    
  4. Execute este comando para ver se a vulnerabilidade node-fetch foi corrigida:

    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. Se o seu projeto tiver algum teste, execute-o para verificar se a atualização não quebrou nada.

  6. Use estas mesmas etapas para atualizar lo-dash para a 4.17.20 versão sem vulnerabilidades.

    As vulnerabilidades foram corrigidas, mas a node-fetch versão ainda é uma versão principal atrás. Se todos os testes forem aprovados, corrija a package.json versão especificada no arquivo para a versão mais recente:

    "node-fetch": "^3.3.2"
    
  7. Em seguida, execute o seguinte comando para atualizar o projeto:

    npm update
    

    Seu projeto agora não deve ter vulnerabilidades npm e estar na versão principal atual.

  8. Faça check-in dos seus package.json e package-lock.json ficheiros.

    Parabéns! Você atualizou as dependências e corrigiu as vulnerabilidades no projeto.

Recipiente de desenvolvimento de limpeza

Depois de concluir o projeto, você pode querer limpar seu ambiente de desenvolvimento ou devolvê-lo ao seu estado típico.

Excluir o ambiente do GitHub Codespaces garante que você possa maximizar a quantidade de direitos de horas gratuitas por núcleo que você obtém para sua conta.

Importante

Para obter mais informações sobre os direitos da sua conta do GitHub, consulte Codespaces do GitHub mensalmente incluídos armazenamento e horas principais.

  1. Entre no painel do GitHub Codespaces (https://github.com/codespaces).

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

  2. Abra o menu de contexto do espaço de código e selecione Excluir.

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