Ejercicio: Administración de actualizaciones de dependencias en el proyecto de Node.js
Tailwind Traders le ha asignado la tarea de trabajar en una aplicación que tiene algunas dependencias no actualizadas. La aplicación es pequeña y solo tiene algunas dependencias. La actualización del código debería ser sencilla. Vea si puede actualizar la aplicación para aprovechar las características más recientes. Durante el proceso, si encuentra alguna vulnerabilidad, corríjala.
Introducción
En una nueva ventana de terminal (Ctrl + Mayús + `), cambie a la carpeta que contiene los archivos de este ejercicio:
cd ../7-exercise-dependency-management
Ejecute este comando para instalar las dependencias:
npm install
Debería ver la salida sobre los paquetes instalados y las vulnerabilidades.
Abra el archivo package.json y busque la sección
dependencies
:"lodash": "^1.1.0", "node-fetch": "^1.0.2"
Observe que los patrones especifican el carácter de inserción (^), que indica las actualizaciones de la versión secundaria para admitir dependencias:
1.x
.Abra el archivo index.js para comprender cómo se usan las dependencias del paquete en la aplicación:
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();
Este código extrae datos de una API de REST mediante el paquete
node-fetch
. Procesa la respuesta ordenándola y toma los tres resultados principales mediante el paquetelodash
. El resultado se almacena en un archivo.
npm audit
Para comprender si hay alguna vulnerabilidad, ejecute este comando:
npm audit
Debería mostrarse una salida similar a esta de ejemplo:
# 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
La salida indica las vulnerabilidades y la versión del paquete que corrige el 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 outdated
En el terminal, ejecute este comando para comprobar si hay dependencias obsoletas:
npm outdated
Debería mostrarse una salida similar a esta de ejemplo:
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
Las versiones actuales y deseadas son las mismas, pero la versión más reciente es diferente. Se ha cumplido la estrategia de actualización semántica especificada en el package.json
, pero las vulnerabilidades siguen existiendo.
npm update
Edite el archivo
package.json
para permitir explícitamente cambios importantes para corregir las vulnerabilidades a partir del paquete más significativo:"node-fetch": "^2.6.6"
Ejecute este comando para ver lo que haría la actualización:
npm update --dry-run
added 3 packages, removed 4 packages, and changed 1 package in 508ms
Ejecute este comando para actualizar el proyecto en función de
package.json
:npm update
Ejecute este comando para ver si se ha corregido la vulnerabilidad de
node-fetch
: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
Si su proyecto tiene alguna prueba, ejecútela para verificar que la actualización no ha dañado nada.
Siga estos mismos pasos para actualizar
lo-dash
a la versión4.17.20
sin vulnerabilidades.Las vulnerabilidades se han corregido, pero la versión
node-fetch
sigue siendo una versión principal. Si se superan todas las pruebas, corrija la versión especificada en el archivopackage.json
a la versión más reciente:"node-fetch": "^3.3.2"
A continuación, ejecute el siguiente comando para actualizar el proyecto:
npm update
Ahora su proyecto no debería tener vulnerabilidades npm y debería estar en la versión principal actual.
Registre los archivos
package.json
ypackage-lock.json
.Felicidades. Ha actualizado las dependencias y ha corregido las vulnerabilidades del proyecto.
Limpiar contenedor de desarrollo
Después de completar el proyecto, puede que desee limpiar el entorno de desarrollo o devolverlo a su estado típico.
La eliminación del entorno de GitHub Codespaces garantiza que pueda maximizar la cantidad de derechos de horas gratuitas por núcleo que obtiene para su cuenta.
Importante
Para obtener más información sobre los derechos de la cuenta de GitHub, consulte Almacenamiento y horas de núcleo incluidas mensualmente en GitHub Codespaces.
Inicie sesión en el panel de GitHub Codespaces (https://github.com/codespaces).
Abra el menú contextual delcodespace y seleccione Eliminar.