2017-06-13 20 views
1

私はCSP(Content-Security-Policy)ヘッダーを示すサンプルExpressアプリケーションを作成していますが、helmet-cspを使用しようとしています。ヘルメット-CSPのドキュメントのすべては、それがapp.use(csp({ ... }))を経由して、標準的なサードパーティのミドルウェアとして使用示し個々のルートにhelmet-cspを実装してください

- これはに自分のアプリケーション内のすべてのルートをCSPヘッダが追加されますが、私は、個々のルートでそれをカスタマイズしたいです。以上により

サンプルアプリケーション

var express = require('express'); 
var http = require('http'); 
var csp = require('helmet-csp'); 
var app = express(); 

app.use(csp({ 
    directives: { 
     frameSrc: ["'none'"] 
    } 
})); 

app.get('/', (request, response) => { 
    response.send('hi, :wave: =]'); 
}); 

app.get('/frameable', (request, response) => { 
    response.send('you can frame me!'); 
}); 

http.createServer(app).listen(80, (err) => { 
    if (err) { 
     return console.log('error', err); 
    } 
}); 

すべてのルートがCSPヘッダを受信します。

コンテンツセキュリティポリシー:フレーム-srcの 'なし'

/frameableルートでは、これを無効にしたいと思います

コンテンツセキュリティポリシー:なるようにCSPヘッダフレーム-SRC「自己」

私は/をルートごとにヘルメット-CSPによって設定されたヘッダをカスタマイズする必要があるときは、

response.setHeader('Content-Security-Policy', "frame-src 'self'"); 

またはヘルメット-CSP自体を経由してこれを行う方法があります:私は手動でのようなラインで各app.get内にそれらを無効にする必要がありますか?

答えて

2

それは関数を返す関数であるため、カスタムミドルウェアは、ちょうどあなたがまた、チェーンミドルウェアできuse(csp)

app.use(function (req, res, next) { 
    if (req.url == '/frameable') { 
     res.set('Content-Security-Policy', 'frame-src \'self\''); 
    } 
    next(); 
}); 

後にそれを追加し、ヘッダを変更することができる:

app.use(function (req, res, next) { 
    var middleware; 

    if (req.url == '/frameable') { 
     middleware = csp({ 
      directives: { 
       frameSrc: ["'self'"] 
      } 
     }); 
    } else { 
     middleware = csp({ 
      directives: { 
       frameSrc: ["'none'"] 
      } 
     }); 
    } 

    middleware(req, res, next); 
}); 
+0

これはヘッダーを直接修正しているので、これは簡単です(私の質問の終わりを見てください)。ミドルウェア自体を介してルート単位でこれを行うことができるのであれば私は不思議です。小文字のCSPヘッダーを手作業で設定するケースインポイントは、世界の終わりではありませんが、複数のオプションを持つ複数のヘッダーがあり、それらが複数のルートでカスタムになっている場合、 'helmet-csp 'を手動で定義するのではなく、 – newfurniturey

+0

連鎖ミドルウェアで再利用が可能 – jasonpenny

+0

ああこれは素晴らしいです - ありがとう!これがミドルウェアタイプのものであることを知っていると(ライブラリに縛られていない)素晴らしいですが、将来的には大いに役立ちます。ありがとう(^_^) – newfurniturey

2

このビヘイビアはExpressに組み込まれています。

Expressでは、ルートごとに複数のリクエストハンドラを指定できます。

app.get('/frameable', csp({ 
    directives: { 
     frameSrc: ["'self'"] 
    } 
}), (request, response) => { 
    response.send('you can frame me!'); 
}); 

あなたは少し物事を分割する場合は、あなたがこのような何かを行うことができます:

var normalCspHandler = csp({ 
    directives: { 
     frameSrc: ["'none'"] 
    } 
}); 

var frameSelfCspHandler = csp({ 
    directives: { 
     frameSrc: ["'self'"] 
    } 
}); 

app.use(normalCspHandler); 

app.get('/frameable', frameSelfCspHandler, (request, response) => { 
    response.send('you can frame me!'); 
}); 

cspあなたがあなたルートハンドラの前にそれを追加することができ、ルートハンドラを返しますので、ところで、私はヘルメットを維持していますので、ご意見があれば教えてください!)

+0

ああ、これは本当に知って良いです - あなたの答えは非常にありがとう=] – newfurniturey