1つのオプションは、あなたが言及したように、すべてのフォームに非表示の入力フィールドを追加することです. しかし、csrf の Express ドキュメントによると:
デフォルト値関数はreq.body
、bodyParser()
ミドルウェアによってreq.query
生成された、 によって生成されたquery()
、および"X-CSRF-Token"
ヘッダー フィールドをチェックします。
したがって、クライアント側のフレームワークによっては、クエリ文字列またはX-CSRF-Token
代替手段を使用することもできます。
ポイントは、次のことを行う必要があることです。
_.csrf
Express からクライアント側にトークンを渡す
_.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
以上のアクションなしでヘッダーに含めます。