es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Node.js Express normalización automática de URL y redirección.

Parece que el comportamiento predeterminado de Express es normalizar las URL que contienen un directorio superior (/../).

Para el código a continuación, si solicito una URL como esta:

http://localhost:8080/foo/../../bar

la solicitud se redirige a:

http://localhost:8080/bar

No pude encontrar ninguna documentación detallada sobre este comportamiento.

Mis preguntas son:

  • ¿Es un comportamiento garantizado?
  • En caso de que no esté sirviendo desde un sistema de archivos, ¿hay alguna forma de preservar la URL “path” original en caso de que esté utilizando otro procesamiento?

por

const express = require("express");
const app = express();

app.get("/*", (req, res) => {
  console.log("url:", req.url);
  console.log("path:", req.path);
  res.send('echo for url=' + req.url + '; path=' + req.path);
});

const port = 8080;
app.listen(port, () => {
  console.log(`Escuchando en el puerto ${port}`);
});
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es un comportamiento garantizado de Express normalizar las URL que contienen directorios superiores (es decir, ‘/../’). Este comportamiento se implementa como una medida de seguridad para evitar ataques de navegación de directorios.

    En caso de que no esté sirviendo desde un sistema de archivos, puede utilizar la opción preserve en el módulo path para preservar la ruta de URL original. Puede modificar el código anterior para incluir esta opción como se muestra a continuación:

    const express = require("express");
    const path = require("path");
    const app = express();
    
    app.get("/*", (req, res) => {
      console.log("url:", req.url);
      console.log("path:", req.path);
      const originalPath = path.normalize(req.url).replace(/^(\.\.[\/\\])+/, "");
      res.send(`echo para url=${req.url}; ruta original=${originalPath}`);
    });
    
    const port = 8080;
    app.listen(port, () => {
      console.log(`escuchando en el puerto ${port}`);
    });
    

    Con esta modificación, la ruta de URL original se preservará incluso si contiene directorios superiores.

Comments are closed.