web-dev-qa-db-fra.com

Dans Node.js / Express, comment ajouter automatiquement cet en-tête à chaque réponse de «rendu»?

J'ai plusieurs de ces "contrôleurs":

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

Remarquez le rendu de la résolution? Je veux ajouter cet en-tête à chaque en-tête de réponse que je fais:

X-XSS-Protection: 0

Comment puis-je ajouter cet en-tête de réponse automatiquement?

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

Assurez-vous simplement qu'il s'agit du premier contrôleur que vous ajoutez, l'ordre est important.

65
BGerrissen

Vous voulez probablement utiliser app.use avec votre propre middleware:

app.use(function(req, res, next) {
    res.header('X-XSS-Protection', 0);
    next();
});
70
Francesc Rosas

Pour express 4.x, la voie idiomatique est la suivante:

La mise en oeuvre

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

Tester

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

Dépendances des développeurs (pour que les tests fonctionnent)

% npm install --save-dev mocha hippie

Documentation pertinente

11
Wil Moore III

vous pouvez créer votre propre méthode middleware comme ceci:

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

puis changez vos itinéraires en qc comme ceci:

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

devrait marcher.

7
pkyeck

Je trouve qu'un autre bon endroit pour injecter des en-têtes par défaut est pendant le middleware de routage. De cette façon, toutes les routes contrôlées par l'instance de routeur recevront les en-têtes.

Par exemple:

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

Utilisez 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()
})

Mais assurez-vous de l'utiliser avant votre méthode API. Comme ça:

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)

Cela m'a pris un certain temps pour le comprendre. Je ne l'ai vu mentionné nulle part, donc l'ajouter pour compléter les réponses précédentes.

1
Evandro Pomatti

Je voudrais souligner qu'aucune de ces réponses ne répond réellement à la question; la question concerne spécifiquement le rendu des réponses; par exemple. pour une application comme:

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

Il n'est pas clair comment ajouter des en-têtes (par exemple, des en-têtes CSP, qui peuvent être très verbeux) niquement à vos réponses HTML. Express n'a pas de crochet pour le faire spécifiquement. La seule option pour le moment est d'organiser votre code afin que vous n'ayez pas à le faire, par ex.

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

... qui vous permet de faire comme le suggèrent certaines des autres réponses, et d'ajouter un middleware générique pour définir les en-têtes.

1
user3697417