感谢您的问题和回答,它有助于解决设置Postman的难题的一部分。我发表自己的答案以澄清一些问题,同时还可以将令牌自动复制到Postman请求中。
app.use(cookieParser())
app.use(csrf({ cookie: { httpOnly: true, }}))
这将返回Cookie 1: _csrf。
httpOnly
的使用是推荐的,因为它可以将cookie保护在JavaScript无法访问的范围之外,更加安全。
设置第二个cookie,需要在每个请求中返回。
app.use((req, res, next) => {
res.cookie('XSRF-TOKEN', req.csrfToken())
next()
})
这需要在每个请求上都设置(使用 POST、DELETE 等方法时),并且每次调用后都会更改
虽然可以使用其他方式(如 body 属性或查询参数)来处理 CSRF,但使用头部似乎更为简洁,特别是在使用 JSON 时。
a. 在 Postman 中设置并发送 GET 请求(因为默认情况下 GET 请求不检查 CSRF)
b. 在 Postman 中设置一个 POST 请求,并使用从 GET 请求中获取的 cookie 值设置此头部。
XSRF-Token abc123...
*注意破折号(-),而不是下划线(_)
Postman自动保存和发送cookie,就像浏览器一样,但我们需要某种方法来获取上次请求的令牌并将其复制到下一个请求中
在Postman中运行的测试会在每个请求后运行一段JavaScript代码,并且对于此目的很有效
我在其中一个GET请求中设置了此测试,因此我确定第一个请求不会失效
// A Postman Test script
const xsrf_token = postman.getResponseCookie('XSRF-Token')
postman.setEnvironmentVariable('xsrf_token', xsrf_token.value)
然后,在您的POST请求头中,用环境变量替换复制的字符串
XSRF-Token {{xsrf_token}}
我曾多次重新学习这个,所以我认为让每个人看到拆分过程会很方便:
const app = require('./app')
app.set('port', 5000);
app.listen(app.get('port'), () => {
console.log('App running on port', app.get('port'));
});
var cookieParser = require('cookie-parser')
var csrf = require('csurf')
var bodyParser = require('body-parser')
var express = require('express')
// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })
// create express app
var app = express()
// parse cookies
// we need this because "cookie" is true in csrfProtection
app.use(cookieParser())
app.get('/form', csrfProtection, function (req, res) {
// pass the csrfToken to the view
// res.render('send', { csrfToken: req.csrfToken() })
res.send({csrfToken: req.csrfToken() })
})
app.post('/process', parseForm, csrfProtection, function (req, res) {
res.send('data is being processed')
})
module.exports = app;
启动服务器
向http://localhost:5000/form发送GET请求
点击“发送”。在请求信息下面,您应该可以看到响应数据中包含以下内容:
复制引号之间的字符串。(在此示例中:H3DsAwqv-FuM06caBMOh6QZRFaILYgFyqFlA)
设置一个POST请求到http://localhost:5000/process
点击“Body”标签并选择“x-www-form-urlencoded”的单选按钮。
输入一个新键“_csurf”,并粘贴我们在GET请求中收到的字符串值。
如果您看到“正在处理数据”,则说明它正在工作!
我制作了一个YouTube教程,以防这让事情变得更容易: https://youtu.be/QruvuwM-kkU
res.send({csrfToken: req.csrfToken() })
响应中的csrfToken是否推荐?没有cookie和策略吗? - 0xAnon