6

我正在尝试为我的服务器端表单验证编写一个测试,但我不断收到一个禁止错误。这似乎需要一个两步的过程。步骤 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 令牌发布数据时重新发送会话 cookie,快递可以使用会话中的秘密来验证您的 csrf 令牌。

于 2014-04-17T03:25:01.830 回答