Impossible de se débarrasser de l'en-tête X-Powered-By: Express

168

J'exécute un serveur sur nodejs avec express. Je n'arrive pas à me débarrasser de l'en-tête:

X-Powered-By:Express

Je me demandais s'il y avait un moyen de se débarrasser de cet en-tête ou dois-je vivre avec?

tyronegcarter
la source
@alessioalex cette question a plus de vues (pour une raison quelconque, elle est plus populaire), alors faisons une autre duplication de ceci à la place.
Alexei Levenkov

Réponses:

247

Dans Express> = 3.0.0rc5:

app.disable('x-powered-by');

Voici un middleware simple qui supprime l'en-tête dans les versions antérieures d'Express:

app.use(function (req, res, next) {
  res.removeHeader("x-powered-by");
  next();
});
Giacomo
la source
16
Je devais le placer avant app.use(app.router);pour que ça marche.
Pavel Hlobil le
2
Identique à app.set ('x-powered-by', false);
harrisunderwork
1
N'a pas fonctionné 4.15.2. La solution @harrisunderwork a app.set()fait l'affaire.
Daniel W.
54

Juste pour reprendre la réponse de rjack, vous pouvez également (facultativement) simplement changer (définir) l'en-tête X-powered-by en quelque chose de beaucoup plus cool / personnalisé comme ceci:

app.use(function (req, res, next) {
  res.header("X-powered-by", "Blood, sweat, and tears")
  next()
})
Christopher Scott
la source
50

À partir d'Express v3.0.0rc5, la prise en charge de la désactivation de l'en- X-Powered-Bytête est intégrée:

var express = require('express');

var app = express();
app.disable('x-powered-by');
poinçonner
la source
20

De la source ( http://expressjs.com/en/api.html#app.set ). Dans Express 4.X, configurez simplement l'application en utilisant la ligne ci-dessous;

app.set('x-powered-by', false) // hide x-powered-by header!
efkan
la source
10

Voici un middleware pratique que vous pouvez ajouter pour remplacer X-Powered-By:

function customHeaders( req, res, next ){
  // Switch off the default 'X-Powered-By: Express' header
  app.disable( 'x-powered-by' );

  // OR set your own header here
  res.setHeader( 'X-Powered-By', 'Awesome App v0.0.1' );

  // .. other headers here

  next()
}

app.use( customHeaders );

// ... now your code goes here

Définir X-Powered by dans ce cas remplacerait la valeur par défaut «Express», vous n'avez donc pas besoin à la fois de désactiver ET de définir une nouvelle valeur.

papercowboy
la source
3

Peut-être que cela pourrait être évident pour les utilisateurs d'Express plus expérimentés, mais seul cela a fonctionné pour moi:

app.configure(function() {
    app.use(function (req, res, next) {
        res.removeHeader("X-Powered-By");
        next();
    });
});
pongi
la source
3

Parfois, les réponses en haut ne fonctionnent pas. C'est mon cas. J'ai Express 4.17.1 et aucune réponse ne fonctionne. J'ai donc inventé ma propre solution:

let app = express();

app.use((req, res, next) => {
  const send = res.send;
  res.send = (data) => {
    res.removeHeader('X-Powered-By');
    return send.call(res, data);
  };

  next();
});
1nstinct
la source
A également travaillé pour la version 4.16.3 Express. Aucune autre solution n'a fonctionné.
Xyroid
1
travaillé pour moi aussi merci!
Fernix
2

Pour se cacher, X-Powered By vous pouvez utiliser le casque Node .js Library .

Le lien pour qui est le casque

var helmet = require('helmet');
app.use(helmet.hidePoweredBy());
arjun kori
la source
Souhaitez-vous inclure une bibliothèque entière pour cela?
Moha le chameau tout-puissant le
oui, nous devons utiliser la bibliothèque de casques. Si vous utilisez expressjs fremework, vous pouvez éviter la bibliothèque par ce code app.disable ("x-powered-by");
arjun kori le
2

Aucun des travailleurs de solutions standard pour moi non plus. Après de nombreuses recherches, j'ai découvert que nous avons utilisé un fichier de routes dans lequel une nouvelle instance express a été lancée, qui a ensuite été ajoutée à la première en utilisant app.use. Uniquement pour les routes de cette nouvelle instance express, l'en-tête X-Powered-By était présent.

Vue simpliste du problème:

const app = express();
app.disable("x-powered-by");
app.get("/ping", (req, res) => res.send("Pong")); // <-- no X-Powered-By header

const moreRoutes = express();
moreRoutes.get("/ping", (req, res) => res.send("Pong")); // <-- X-Powered-By header still present

app.use("/api/v2", moreRoutes);

La solution était simplement de créer un nouveau routeur express au lieu d'une instance entière.

const moreRoutes = express.Router();
Jacco Mol
la source
1

La lecture du code https://github.com/visionmedia/express/blob/master/lib/http.js#L72 me fait penser que vous devrez vivre avec car cela ne semble pas être conditionnel.

Si vous avez un frontend nginx / apache, vous pouvez toujours supprimer l'en-tête avec lui (avec mod_headers pour apache et headers-more pour nginx)

hellvinz
la source
1
Je pense que l'approche de serveur Web est la meilleure de toute façon. Cela soutient une meilleure pratique.
Dominic
0

removeHeader fonctionnera uniquement dans le middleware de routage, exemple coffeescript

fix_headers =  (req, res, next) ->
    res.removeHeader 'X-Powered-By'
    next()

app.get '/posts', fix_headers, (req, res, next) ->
  ...
Dejan Ranisavljevic
la source
0

Rien de tout cela n'a fonctionné pour moi, sauf ceci (vous devez ajouter un autre paramètre):

app.use(helmet.hidePoweredBy({ setTo: 'guesswhat' }))

J'utilise Express ^ 4.17

László Matuska
la source