En El Nodo.js/Express, ¿cómo puedo agregar automáticamente este encabezado para cada «render» de la respuesta?

Tengo muchos de estos «controladores»:

app.get('/',function(req,res){
    var stuff = { 'title': 'blah' };
    res.render('mytemplate',stuff);
});    

Aviso res.render? Quiero añadir este encabezado para cada encabezado de respuesta puedo hacer:

X-XSS-Protection: 0

¿Cómo puedo añadir que el encabezado de respuesta automática?

InformationsquelleAutor TIMEX | 2011-07-12

7 Kommentare

  1. 65
    //global controller
    app.get('/*',function(req,res,next){
        res.header('X-XSS-Protection' , 0 );
        next(); //http://expressjs.com/guide.html#passing-route control
    });

    Sólo asegúrese de que este es el primer controlador de agregar, el orden es importante.

    • aahh, este parece aún mejor
    • si usted realmente desea agregar el argumento de cabecera para todas las llamadas esta es la forma más corto que añadir el middleware de llamada para cada ruta.
    • Así que añadiendo esta como el primer controlador, todos mis otros controladores que han encabezado en el interior de su respuesta?
    • Afaik sí, por lo que es posible ruta de respuesta a través de varios controladores.
    • Esto está fuera de fecha, ahora, ver a continuación.
    • ¿Qué hace el next() llamada a la función de hacer? Funciona sin él, así que era una especie de curiosidad

  2. 71

    Usted probablemente desea utilizar app.uso con su propio middleware:

    app.use(function(req, res, next) {
        res.header('X-XSS-Protection', 0);
        next();
    });
    • Esto es lo que todo el mundo debería estar usando ahora.
    • Sí, este es el camino a seguir en Express 4. Utilice siempre app.use
    • Mucho mejor que la que se exceptúan de respuesta.
    • Nota res.set es un alias es la función para la cual el método utilizado aquí — res.header — es un alias
  3. 12

    Para expresar 4.x, el idiomáticas manera es como sigue:

    Aplicación

    //no mount path; executed for every request.
    app.use(function (req, res, next) {
      res.set('X-XSS-Protection', 0);
      next();
    });

    De prueba

    describe('Response Headers', function () {
      it('responds with header X-XSS-Protection: 0', function (done) {
        hippie(app)
        .get('/any/route/you/can/think/of')
        .expectHeader('X-XSS-Protection', 0)
        .end(done);
      });
    });

    Dev Dependencias (para pruebas de trabajo)

    % npm install --save-dev mocha hippie

    La Documentación Pertinente

  4. 7

    usted puede crear su propio middleware método así:

    addToHeader = function (req, res, next) {
      console.log("add to header called ... " + req.url);
      res.header('X-XSS-Protection', '0');
      next();
    }

    y, a continuación, cambiar sus rutas a algo como esto:

    app.get('/', addToHeader, function(req,res){
      var stuff = { 'title': 'blah' };
      res.render('mytemplate',stuff);
    });

    debería funcionar.

  5. 3

    Me parece que otro buen lugar para inyectar encabezados por defecto es durante el Enrutamiento de Middleware. De esta manera, todas las rutas controladas por el router instancia recibirá los encabezados.

    Por ejemplo:

    //...
    var router = express.Router();
    
    //middleware for all routes
    router.use(function(req, res, next) {
      //inject default headers
      res.header('cache-control', 'private, max-age=0');
      res.header('expires', new Date(Date.now()).toUTCString());
      next();
    });
    
    //all routes below will now inherit 
    //the middleware's default headers
    router.get('/users', function(req, res){
       //I will return the user list, with default headers
       //...
    });
  6. 1

    Me gustaría señalar que ninguno de estos contestar responder a la pregunta; la pregunta es específicamente relacionadas con procesamiento de las respuestas; por ejemplo, para una aplicación como:

    const router = require('express').Router();
    router.use('/test.json', (req, res) => res.json({ test: 'hi' });
    router.use('/test.html', (req, res) => res.render('test'));

    No está claro cómo agregar encabezados (por ejemplo, CSP cabeceras, que puede ser muy detallado) sólo en el código HTML de las respuestas. Express no tiene un gancho específicamente para hacer eso. La única opción en este momento es la de organizar el código por lo que no tiene, por ejemplo,

    app.use(jsonRouter);
    app.use(htmlRouter);

    …que te permite hacer como algunas de las otras respuestas sugieren, y agregar middleware genérica para el establecimiento de las cabeceras.

  7. 1

    Utilizar un middleware

    app.use(function (req, res, next) {
      res.header("Access-Control-Allow-Origin", "*")
      res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
      next()
    })

    Pero asegúrese de utilizar que antes de su método de la API. Como este:

    const app = express()
    
    //middleware
    app.use(function (req, res, next) {
      res.header("Access-Control-Allow-Origin", "*")
      res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
      next()
    })
    
    //api
    app.get('/user', (req, res, next) => {
      service.doSomething
        .then(data => res.send(data))
        .catch(next)
    })
    
    app.use(handleError)

    Me tomó un tiempo para averiguar. Yo no veo que se menciona en ninguna parte así que la adición de este para complementar las anteriores respuestas.

    • Sin duda, este doble app.use(app.use( cosa está mal. ¿No es así? Creo que el resultado sería un Cyclic __proto__ value de error. Debe ser sólo un app.use( y solucionar el })) a sólo })
    • fijo que ahora

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea