如何使用 CSRF 测试 express form post?

Posted

技术标签:

【中文标题】如何使用 CSRF 测试 express form post?【英文标题】:How to test express form post with CSRF? 【发布时间】:2014-06-01 03:58:14 【问题描述】:

我正在尝试为我的服务器端表单验证编写一个测试,但我不断收到一个禁止错误。这似乎需要一个两步的过程。步骤 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 要求。我尝试得越多,这对于看起来很简单的事情就越复杂。也许我对这一切都错了。有什么想法吗?

【问题讨论】:

这清楚了吗? jb.demonte.fr/blog/expressjs-angularjs-csrf @adrichman,我想我应该说它在我的表单中工作得很好,我只是不知道如何为它编写测试。当测试尝试发布时,无论我尝试什么,它都会收到一个禁止错误:( 我不确定您引用的语法,但看起来您可能需要重构,以便您专门设置一个 'x-csrf-token' HEADER 等于位于饼干。 【参考方案1】:

express csrf 中间件在会话中保存了一个秘密来验证 csrf 令牌,而我猜你使用 cookieSession 中间件作为会话存储。所以你需要在使用 csrf token POST 数据时重新发送 session cookie,express 可以使用 session 中的 secret 来验证你的 csrf token。

【讨论】:

【参考方案2】:

感谢@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);
      );
);

【讨论】:

这真是太棒了。我只是不知道如何让 jQuery 像这样运行。我正在节点上运行我的测试并测试一个快速应用程序。所以我真的没有完整的文档结构。我补充说: var jQuery = require('jQuery');错误是:未捕获的错误:jQuery 需要一个带有文档的窗口 我认为你需要像 jsdom 这样的东西,检查这个问题的答案:***.com/questions/21358015/… 或查看如何更好地从 cookie 中获取 csrf 令牌:***.com/questions/18773846/…

以上是关于如何使用 CSRF 测试 express form post?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Express 中生成 CSRF 令牌?

如何使用 express.js 在 Ajax 调用中实现 CSRF 保护(寻找完整示例)?

Node Express 和 csurf - 403(禁止)无效 csrf 令牌

显式打印 CSRF 令牌字段而不是 form_rest(form)?

在nodejs(Express)中使用CSURF的“无效的csrf令牌”。CSRF令牌适用于第一个请求,但对所有其他请求都给出错误

VueJS 和 express 传递 csrf 令牌发布