6

サーバー側のフォーム検証用のテストを作成しようとしていますが、Forbidden エラーが発生し続けます。これは2段階のプロセスである必要があるようです。ステップ 1、フォームから CSRF 値を取得します。ステップ 2、CSRF 値を使用してフォーム ハンドラーに投稿します。ただし、どのように投稿しようとしても、禁止されたエラーが発生します。

-- 完全なテスト: https://github.com/socketwiz/swblog/blob/master/test/contact.js#L57-L100

したがって、次の行を変更してみました: https://github.com/socketwiz/swblog/blob/master/test/contact.js#L85

.send({name: 'foo', 'X-CSRF-Token': token})

.set('X-CSRF-Token', token)

.set('Cookie', ['X-CSRF-Token=' + token])

しかし、私が試みたものはどれも CSRF 要件を満たすようには見えません。単純なことのように見えても、試行錯誤すればするほど複雑になります。たぶん、私はこれについてすべて間違っています。何か案は?

4

2 に答える 2

16

@shawnzhu に感謝します。Cookie に関するコメントは、私が何をする必要があるかを理解するのに役立ちました。私はそれを複雑にしすぎているという考えを持っていました。これが私が思いついたものです:

https://github.com/socketwiz/swblog/blob/master/test/contact.js

it('should not post just a name', function(done) {
    request(mock)
      .get('/contact')
      .end(function(err, res){
        var $html = jQuery(res.text);
        var csrf = $html.find('input[name=_csrf]').val();

        request(mock)
          .post('/api/contact.json')
          .set('cookie', res.headers['set-cookie'])
          .send({
            _csrf: csrf,
            name: 'Mary Jane'
          })
          .expect(function(res){
            assert.equal(undefined, res.body.name);
            assert.equal('You must provide a valid email address', res.body.email);
            assert.equal('You must provide a message', res.body.message);
          })
          .expect(500, done);
      });
});
于 2014-04-19T02:13:05.833 に答える
1

Express csrf ミドルウェアはセッションにシークレットを保存して csrf トークンを検証しますが、cookieSession ミドルウェアをセッション ストアとして使用していると思います。そのため、csrf トークンを使用してデータを POST するときにセッション Cookie を再送信する必要があります。エクスプレスはセッションでシークレットを使用して、csrf トークンを検証できます。

于 2014-04-17T03:25:01.830 に答える