如何使用 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.js 在 Ajax 调用中实现 CSRF 保护(寻找完整示例)?
Node Express 和 csurf - 403(禁止)无效 csrf 令牌
显式打印 CSRF 令牌字段而不是 form_rest(form)?
在nodejs(Express)中使用CSURF的“无效的csrf令牌”。CSRF令牌适用于第一个请求,但对所有其他请求都给出错误