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?


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

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

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


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.


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

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

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

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

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)


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.