Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用CSRF测试express form post?_Javascript_Express_Supertest - Fatal编程技术网

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令牌。

express 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,完成);
});
});

谢谢@shawnzhu,你对cookies的评论帮助我找到了我需要做的事情。我觉得我把事情复杂化了。以下是我的想法:

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

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

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