2011-12-05 3 views
4

Node.jsアプリケーション用のコンテンツセキュリティポリシー(CSP)の実装に興味があります。 Mozillaのドキュメントは役に立ちますが、私はviolation reportsを有効にする方法に固執しています。私は彼らがどのように動作するのかについての基本的な前提を理解しています(違反をウェブサイトに通知するためにブラウザは指定されたURLにPOSTリクエストを送信しますが)HTTPリクエストの違反を記述するJSONドキュメントの場所を特定できませんでした。おそらく、これはHTTP仕様をよく知っている人にとっては明らかでした。Node.js/Expressの要求(CSP違反報告用)からエンティティ本文を取得するにはどうすればよいですか?

CSPのW3C draftを見て、私は、JSONがHTTPの "entity body"という部分に含まれていることを確認しました。私はエンティティの目的が何であるかまだ分かりません(私がこの問題で見つけることができるわずかに有用なページはHTTP仕様からのものでした)。私はそれを要求の本文と仮定しています。

もっと重要なのは、エンティティ本体の内容を取得する方法が見つからないことでしょう。私はreq.header('entity-body')を使用することを考えましたが、エンティティはHTTPヘッダーではないので動作しません。それは何ですか、それをどのように取り出すのですか?

(さらに、Node.jsでCSP違反の報告を実装する方法に関するチュートリアルを見つけようとしましたが、何も見つかりませんでしたが、PHP用に見つけましたが、 Node.js/Expressのものに似ています)

ご協力いただければ幸いです。

答えて

4

私は事を過剰分析していました。エクスプレスのためにexpress.bodyParser()ミドルウェアを有効にし、req.bodyをPOSTイベントハンドラにフェッチするだけです。 JSON違反レポートを含むHTTPリクエストの本文を取得します。

有効ミドルウェア:

var server = express.createServer(
    // other middleware here 
    express.bodyParser() 
); 

取得違反レポート:私は私のcsp violationsを報告するnginxのでガラス張りExpressアプリと私は上記の回答から学んだ二つのことを得て、いくつかの困難を経て

server.post('/csp/', function(req, res) { 
    console.log(req.body); 
}); 
+0

これが正しい答えであれば、あなたはそれを受け入れて、質問が回答されたことを知るようにしてください。これを行うには、答えの横のチェックマークをクリックします。 –

+0

私はそれを試みたが、自分の答えを受け入れる前に3日間待たなければならないことを知らされた。 –

0

次のとおりです。

  1. POST方法はないGET方法
  2. req.bodyは、レポートに

が含まれている。しかし、上記は十分ではなかったと私は空req.bodyを取得保管し、私はそれを修正する方法を説明するための他の記事を見つけることができませんでした。いくつかの研究の後、私はこのpostと完全に隔離されたギブスを見つけましたissuedougwilsonは、csp reportを扱うルートをどこに置くべきかのヒントを示しています。私は、次のconfigs後csp reportルートハンドラを置いているためreq.bodyが私のために空だった

理由があった。

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(cookieParser()); 

私は、これらの上にcsp reportルートハンドラを移動しますが、私はまだ空req.bodyその後、I取得保管の上に上記の行を追加した後req.body

app.use(bodyParser.json({ type: 'application/csp-report' })); 

でレポートを取得するにはcsp reportルートハンドラの上、以下を追加しました要求ハンドラExpressは、コンテンツタイプがapplication/csp-reportの要求を解析する必要があると認識しています。

Expressデフォルトでは、application/csp-reportを解析せず、上記のを追加して解決しました私の問題です。 ( - あなたはFFの問題に直面した場合、あなたはまた、application/jsonを含むことができ、私はChromeを使用しています)Expressはデフォルトでapplication/csp-reportを解析し、私はFirefoxがapplication/jsonを送るのに対し、Chromeapplication/csp-reportを送信することを主張し、このgistに出くわした場合、私はまた、Googleで検索します。

だから、これはOPで掲示受け入れ答えが2011からのものであり、私は次のバージョンで2016でこの問題を解決する方法を示すために答えを追加することを考え、それは私のapp.js

// without following csp-report don't get parsed. 
app.use(bodyParser.json({ type: 'application/csp-report' })); 

app.get('/vehicle/cspreport', function(req, res) { 
    res.status(403); 
}); 

app.post('/vehicle/cspreport', function(req, res) { 
    console.log('csp report > ' + JSON.stringify(req.body)); 
}); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(cookieParser()); 
... 

にどのように見えるかですNode.js、Express、Nginx

関連する問題