1つのオプションは、あなたが言及したように、すべてのフォームに非表示の入力フィールドを追加することです. しかし、csrf の Express ドキュメントによると:
デフォルト値関数はreq.body、bodyParser()ミドルウェアによってreq.query生成された、 によって生成されたquery()、および"X-CSRF-Token"ヘッダー フィールドをチェックします。
したがって、クライアント側のフレームワークによっては、クエリ文字列またはX-CSRF-Token代替手段を使用することもできます。
ポイントは、次のことを行う必要があることです。
_.csrfExpress からクライアント側にトークンを渡す
_.csrfすべての状態変更要求 (POST/PUT/DELETE) でクライアント側からトークンを Express に戻して、Express がそれを と比較してreq.session._csrfサイクルを完了することができるようにします。
たとえば、クライアント側が Angular の場合、$httpモジュールはデフォルトで csrf 保護を提供し、呼び出された Cookie を探して、XSRF-TOKENすべての状態変更要求 (POST/PUT/DELETE) でこの値を というヘッダーを介して返しますX-XSRF-TOKEN。この名前は Express が検索するヘッダー名X-CSRF-TOKEN(notice-XSRF-と-CSRF-) とは異なるため、これは不運な偶然です。
これを克服するには、
ステップ 1 : Express 側で、CSRF ミドルウェアのデフォルト値関数を拡張して、X-XSRF-TOKEN他のすべてのデフォルトの場所に加えて、ヘッダー内のトークン値を検索します。
app.use(express.csrf({value: function(req) {
var token = (req.body && req.body._csrf) ||
(req.query && req.query._csrf) ||
(req.headers['x-csrf-token']) ||
// This is the only addition compared to the default value function
(req.headers['x-xsrf-token']);
return token;
}
});
ステップ 2req.session._csrf : Express 側で、カスタム ミドルウェアを使用して、CSRF ミドルウェアによって Angular が検索する Cookie の下に追加されたトークン値を再度設定します。
app.use(function(req, res, next) {
req.cookie('XSRF-TOKEN', req.session._csrf);
next();
});
これで、Angular はそれを見つけて、それX-XSRF-TOKEN以上のアクションなしでヘッダーに含めます。