4

Node.jsアプリケーションにコンテンツセキュリティポリシー(CSP)を実装することに興味があります。Mozillaのドキュメントはかなり役に立ちますが、違反レポートを有効にする方法に固執しています。それらがどのように機能するか(ブラウザが指定されたURLにPOSTリクエストを送信してWebサイトに違反を通知する)の基本的な前提は理解していますが、HTTPリクエストで違反を説明するJSONドキュメントがどこにあるかわかりませんでした。おそらく、これはHTTP仕様に精通している人には明らかだったでしょう。

CSPのW3Cドラフトを見ると、JSONが「エンティティ本体」と呼ばれるHTTPの一部に含まれていることがわかりました。私はまだエンティティの目的が何であるかを知りません(私がこの問題で見つけることができた唯一のやや有用なページはHTTP仕様からのものでした)。リクエストの本文だと思います。

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

(さらに、Node.jsでCSP違反レポートを実装する方法に関するチュートリアルを見つけようとしましたが、何も見つかりませんでした。PHP用のチュートリアルは見つかりましたがfile_get_contents('php://input')、Nodeに似たものがないものを参照して、特に役に立ちませんでした。 .js / Express。)

どんな援助でも大歓迎です。

4

2 に答える 2

4

物事を分析しすぎていたことが判明しました。必要なことはexpress.bodyParser()、Express 用のミドルウェアを有効にreq.bodyしてから、POST イベント ハンドラーでフェッチすることだけです。これにより、JSON 違反レポートを含む HTTP 要求の本文が取得されます。

ミドルウェアを有効にします。

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

違反レポートの取得:

server.post('/csp/', function(req, res) {
    console.log(req.body);
});
于 2011-12-06T08:04:01.693 に答える
1

ExpressアプリをNginxで報告するのに苦労csp violationsしましたが、上記の回答から学んだ2つのことは次のとおりです。

  1. POSTメソッドではなくGETメソッドであるべき
  2. req.bodyレポートを含む

しかし、上記は十分ではなく、空になり続け、req.bodyそれを修正する方法を説明する他の投稿が見つかりませんでした. いくつかの調査の後、私はこの投稿に出くわしましdougwilsoncsp report.

req.bodyが空だった理由はcsp report、次の構成の後にルート ハンドラーを配置したためです。

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

これらの上にルートハンドラーを移動しましたcsp reportが、まだ空になり続けていたので、レポートを取得するためにreq.body上記のルートハンドラーを追加しましたcsp reportreq.body

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

csp reportリクエスト ハンドラの上に上記の行を追加した後、ExpressContent-type を持つリクエストを として解析する必要があることを理解しましたapplication/csp-report

おそらくExpressデフォルトでは parse を行わずapplication/csp-report、上記を追加することで問題が解決しました。また、if Expressparsesをデフォルトでグーグル検索したところ、Firefox が送信するのに対して送信することを主張するこの要点application/csp-reportに出くわしました(そして、私は Chrome を使用しています -で問題が発生した場合も含めることができます)。Chromeapplication/csp-reportapplication/jsonapplication/jsonFF

だから、これは私の中でどのように見えるかです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());
...

OPによって投稿された受け入れられた回答はからであり、次のバージョンのNode.js、Express、およびNginxで2011この問題をどのように解決したかを示す回答を追加することを考えました2016

Node: v4.2.4
Express: 4.13.1 
Nginx: 1.8.1  
于 2016-02-11T22:05:12.183 に答える