web-dev-qa-db-ja.com

Node.js / Expressでは、このヘッダーをすべての「レンダリング」応答に自動的に追加するにはどうすればよいですか?

これらの「コントローラー」の多くがあります。

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

Res.renderに注意してください。このヘッダーを、作成するすべての応答ヘッダーに追加します。

X-XSS-Protection: 0

その応答ヘッダーを自動的に追加するにはどうすればよいですか?

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

これが最初に追加するコントローラーであることを確認してください。順序は重要です。

65
BGerrissen

おそらく、独自のミドルウェアで app.use を使用する必要があります。

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

Express 4.xの慣用的な方法は次のとおりです。

実装

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

テスト

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

開発依存関係(テストが機能するため)

% npm install --save-dev mocha hippie

関連ドキュメント

11
Wil Moore III

次のような独自のミドルウェアメソッドを作成できます。

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

そして、次のようにルートをsthに変更します。

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

動作するはずです。

7
pkyeck

デフォルトのヘッダーを挿入するもう1つの良い場所は、ルーティングミドルウェア中です。これにより、ルーターインスタンスによって制御されるすべてのルートがヘッダーを受信します。

例えば:

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

ミドルウェア ...を使用します.

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メソッドの前に使用してください。このような:

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)

それを理解するためにしばらくかかりました。私はそれがどこにも言及されていなかったので、これを追加して以前の答えを補完します。

1
Evandro Pomatti

これらの答えのどれも実際に質問に答えていないことを指摘したいと思います。質問は、特に応答のレンダリングに関連しています。例えば次のようなアプリの場合:

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

ヘッダーを追加する方法は明確ではありません(非常に冗長になる可能性のあるCSPヘッダーなど)onlyをHTML応答に追加します。 Expressには、特にそれを行うためのフックがありません。現時点で唯一のオプションは、コードを整理することです。

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

...これにより、他の回答の一部が示すように、ヘッダーを設定するための汎用ミドルウェアを追加できます。

1
user3697417