Tengo muchos de estos "controladores":

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

Aviso res.render? Quiero agregar este encabezado a cada encabezado de respuesta que haga:

X-XSS-Protection: 0

¿Cómo puedo agregar ese encabezado de respuesta automáticamente?

37
TIMEX 12 jul. 2011 a las 12:04

7 respuestas

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

Solo asegúrese de que este sea el primer controlador que agregue, el orden es significativo.

65
BGerrissen 12 jul. 2011 a las 08:30

Probablemente desee utilizar app.use con su propio middleware:

app.use(function(req, res, next) {
    res.header('X-XSS-Protection', 0);
    next();
});
74
Francesc Rosas 4 jul. 2013 a las 22:56

Encuentro que otro buen lugar para inyectar encabezados predeterminados es durante el enrutamiento Middleware. De esta manera, todas las rutas controladas por la instancia del enrutador recibirán 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
   // ...
});
3
obrientimothya 12 sep. 2015 a las 00:06

Me gustaría señalar que ninguna de estas respuestas realmente responde la pregunta; la pregunta se relaciona específicamente con dar respuestas; p.ej. 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, encabezados CSP, que pueden ser muy detallados) solo a sus respuestas HTML. Express no tiene un gancho para hacer eso específicamente. La única opción en este momento es organizar su código para que no tenga que hacerlo, p.

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

... que le permite hacer lo que sugieren algunas de las otras respuestas y agregar middleware genérico para configurar los encabezados.

1
user3697417 26 jul. 2016 a las 01:08

Podría crear su propio método de middleware de la siguiente manera:

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

Y luego cambia tus rutas a algo así:

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

Debe funcionar.

7
pkyeck 12 jul. 2011 a las 08:31

Para express 4.x, la forma idiomática es la siguiente:

Implementación

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

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);
  });
});

Dependencias de desarrollo (para que las pruebas funcionen)

% npm install --save-dev mocha hippie

Documentación relevante

13
Wil Moore III 5 dic. 2014 a las 04:16

Utilice 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 usarlo antes de su método API. Me gusta esto:

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 resolverlo. No lo vi mencionado en ninguna parte, así que agregué esto para complementar las respuestas anteriores.

1
Evandro Pomatti 22 jun. 2019 a las 22:18