Javascript 如何使用CSRF测试express form post?

Javascript 如何使用CSRF测试express form post?,javascript,express,supertest,Javascript,Express,Supertest,我正试图为我的服务器端表单验证编写一个测试,但我一直收到一个禁止的错误。这似乎需要一个两步的过程。步骤1,从表格中获取CSRF值。第2步,使用CSRF值发布到表单处理程序。然而,无论我如何尝试张贴我得到一个禁止的错误 --全面测试: 我试着改变了下面这句话: 但我尝试的任何东西似乎都不能满足CSRF的要求。我越是尝试,这件看似简单的事情就变得越复杂。也许我完全错了。有什么想法吗?快速csrf中间件在会话中保存一个秘密以验证csrf令牌,而我猜您使用中间件作为会话存储。因此,当使用csrf令牌发

我正试图为我的服务器端表单验证编写一个测试,但我一直收到一个禁止的错误。这似乎需要一个两步的过程。步骤1,从表格中获取CSRF值。第2步,使用CSRF值发布到表单处理程序。然而,无论我如何尝试张贴我得到一个禁止的错误

--全面测试:

我试着改变了下面这句话:


但我尝试的任何东西似乎都不能满足CSRF的要求。我越是尝试,这件看似简单的事情就变得越复杂。也许我完全错了。有什么想法吗?

快速csrf中间件在会话中保存一个秘密以验证csrf令牌,而我猜您使用中间件作为会话存储。因此,当使用csrf令牌发布数据时,您需要重新发送会话cookie,express可以使用会话中的机密验证您的csrf令牌。

谢谢@shawnzhu,您对cookie的评论帮助我了解了我需要做什么。我觉得我把事情复杂化了。以下是我的想法:

it('不应只发布名称',函数(完成){
请求(模拟)
.get(“/contact”)
.end(函数(err、res){
var$html=jQuery(res.text);
var csrf=$html.find('input[name=_csrf]').val();
请求(模拟)
.post('/api/contact.json')
.set('cookie',res.headers['set-cookie'])
.发送({
_csrf:csrf,
姓名:“玛丽·简”
})
.expect(函数(res){
assert.equal(未定义,res.body.name);
assert.equal('您必须提供有效的电子邮件地址',res.body.email);
assert.equal('您必须提供消息',res.body.message);
})
.预计(500,完成);
});
});

这是否清除了任何内容@adrichman,我想我应该说,从我的表格来看,它工作得很好,我只是不知道如何为它编写测试。当测试尝试发布时,无论我尝试了什么,它都会收到一个禁止的错误:(我不确定您引用的语法,但看起来您可能需要重构,以便专门将“x-csrf-token”头设置为与cookie上的令牌相同。这真是太棒了。我只是不知道如何让jQuery像这样运行。我正在节点上运行测试并测试express应用程序。因此,我没有完整的文档结构。我添加了:var jQuery=require('jQuery');错误是:Uncaught Error:jQuery需要一个包含文档的窗口。我认为您需要像jsdom这样的东西,请检查这个问题的答案:或者检查如何更好地从cookie中获取csrf令牌:
.send({name: 'foo', 'X-CSRF-Token': token})

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

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