Ejercicio: Administración de actualizaciones de dependencias en el proyecto de Node.js

Completado

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

  1. 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
    
  2. Ejecute este comando para instalar las dependencias:

    npm install
    

    Debería ver la salida sobre los paquetes instalados y las vulnerabilidades.

  3. 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.

  4. 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 paquete lodash. 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

  1. 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"
    
  2. 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
    
  3. Ejecute este comando para actualizar el proyecto en función de package.json:

    npm update
    
  4. 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
    
  5. Si su proyecto tiene alguna prueba, ejecútela para verificar que la actualización no ha dañado nada.

  6. Siga estos mismos pasos para actualizar lo-dash a la versión 4.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 archivo package.json a la versión más reciente:

    "node-fetch": "^3.3.2"
    
  7. 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.

  8. Registre los archivos package.json y package-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.

  1. Inicie sesión en el panel de GitHub Codespaces (https://github.com/codespaces).

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

  2. Abra el menú contextual delcodespace y seleccione Eliminar.

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