3

http://sporcic.org/2012/10/csrf-with-nodejs-and-express-3から:

app.use(express.csrf());
app.use(function(req, res, next){
    res.locals.token = req.session._csrf;
    next();
});
app.use(app.router);

上記の保護を利用するには_csrf、管理者専用ページを含むすべてのフォームに非表示の非表示の入力を配置する必要があるということですか?

4

2 に答える 2

8

1つのオプションは、あなたが言及したように、すべてのフォームに非表示の入力フィールドを追加することです. しかし、csrf の Express ドキュメントによると:

デフォルト値関数はreq.bodybodyParser()ミドルウェアによって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以上のアクションなしでヘッダーに含めます。

于 2014-04-10T09:42:30.507 に答える
1

その記事のさらに下で、著者は、これにより、非表示の入力フィールドに含める必要があるすべてのテンプレートに「トークン」プロパティが公開されると説明しています。

彼の jade の例の 2 行目に注目してください。

form(action='/form',method='post')
  input(type='hidden', name='_csrf', value=token)
  label(for='color') Color:
  input(type='text',name='color',size='50')
  button(type='submit') Save
于 2013-10-24T13:20:50.677 に答える