Exercício – Gerenciar atualizações de dependência no projeto do Node.js
A Tailwind Traders solicitou que você trabalhe em um aplicativo que tem algumas dependências desatualizadas. O aplicativo é pequeno e tem somente algumas dependências. A atualização do código deve ser simples. Veja se você pode atualizar o aplicativo para tirar proveito dos recursos mais recentes. Enquanto estiver fazendo isso, se encontrar alguma vulnerabilidade, aproveite para corrigi-la.
Introdução
Em uma nova janela do terminal (Ctrl + Shift + `), alterne para a pasta que tem os arquivos deste exercício:
cd ../7-exercise-dependency-management
Instale as dependências executando este comando:
npm install
Você deve ver a saída sobre os pacotes instalados e quaisquer vulnerabilidades.
Abra o arquivo package.json e veja a seção
dependencies
:"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 dar suporte a dependências:
1.x
.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 pacote
node-fetch
. Ele processa a resposta classificando-a e obtém os três principais resultados usando o pacotelodash
. O resultado é armazenado em um arquivo.
Auditoria do npm
Para entender se há vulnerabilidades, execute este comando:
npm audit
Você deverá 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ê deverá 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 atuais 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
Edite o arquivo
package.json
para permitir explicitamente que as principais alterações corrijam as vulnerabilidades começando com o pacote mais significativo:"node-fetch": "^2.6.6"
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
Execute este comando para atualizar o projeto com base no
package.json
:npm update
Execute este comando para ver se a vulnerabilidade de
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
Se o projeto tiver testes, execute-os para verificar se a atualização não interrompeu nada.
Use essas mesmas etapas para atualizar
lo-dash
para a versão4.17.20
sem vulnerabilidades.As vulnerabilidades são corrigidas, mas a versão
node-fetch
ainda é uma versão principal por trás. Se todos os testes forem aprovados, corrija a versão especificada no arquivopackage.json
para a versão mais recente:"node-fetch": "^3.3.2"
Em seguida, execute o seguinte comando para atualizar o projeto:
npm update
Seu projeto agora não deve ter nenhuma vulnerabilidade do npm e estar na versão principal atual.
Faça check-in de seus arquivos
package.json
epackage-lock.json
.Parabéns! Você atualizou as dependências e corrigiu as vulnerabilidades no projeto.
Limpar o contêiner de desenvolvimento
Depois de concluir o projeto, limpe o ambiente de desenvolvimento ou devolva-o ao estado padrão.
A exclusão do ambiente GitHub Codespaces garante que você possa maximizar a quantidade de horas gratuitas por núcleo que você tem direito na sua conta.
Importante
Para saber mais sobre os direitos da sua conta do GitHub, confira O GitHub Codespaces inclui mensalmente armazenamento e horas de núcleo.
Entre no painel do GitHub Codespaces (https://github.com/codespaces).
Abra o menu de contexto do codespace e selecione Excluir.