Exercício – Gerir atualizações de dependência no seu projeto Node.js
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.
Começar agora
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
Instale as dependências ao executar 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
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
.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 olodash
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
Edite o
package.json
arquivo para permitir explicitamente alterações importantes para corrigir 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
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 seu projeto tiver algum teste, execute-o para verificar se a atualização não quebrou nada.
Use estas mesmas etapas para atualizar
lo-dash
para a4.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 passarem, corrija apackage.json
versão especificada no arquivo 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 vulnerabilidades npm e estar na versão principal atual.
Faça check-in dos seus
package.json
epackage-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.
Entre no painel do GitHub Codespaces (https://github.com/codespaces).
Abra o menu de contexto do espaço de código e selecione Excluir.