【发布时间】:2021-02-24 01:26:44
【问题描述】:
根据 CSURF 文档,您如何设置工作服务器以在 Postman 中测试 CSURF: http://expressjs.com/en/resources/middleware/csurf.html
【问题讨论】:
根据 CSURF 文档,您如何设置工作服务器以在 Postman 中测试 CSURF: http://expressjs.com/en/resources/middleware/csurf.html
【问题讨论】:
感谢您的提问和回答,它帮助解决了设置 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 等的请求)并且在每次调用后都不同 使用标头有其他选择(可以使用正文属性或查询),但使用标头似乎更干净,尤其是在使用 JSON 时
一个。在 Postman 上设置并发送 GET 请求(因为 get 请求默认不检查 csrf)
b.在 Postman 中设置 POST 请求,使用 GET 请求中的 cookie 值设置此标头
XSRF-Token abc123...
*注意连字符 (-),而不是下划线 (_)
Postman 像浏览器一样自动保存和发送 cookie,但我们需要某种方式从上一个请求中获取令牌并将其复制到我们的下一个请求中
Postman 中的测试在每个请求后运行一个 Javascript 的 sn-p,并且可以很好地用于此目的
我在我的一个 GET 请求上设置了这个测试,所以我确信它不会在第一个请求上无效
// A Postman Test script
const xsrf_token = postman.getResponseCookie('XSRF-Token')
postman.setEnvironmentVariable('xsrf_token', xsrf_token.value)
然后,在您的 POST 请求的标头中,为环境变量切换出复制粘贴的字符串
XSRF-Token {{xsrf_token}}
现在您应该可以在 Postman 中发布您心中的内容了
【讨论】:
我不得不重新学习几次,所以我认为每个人都可以方便地查看故障:
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)
设置对 http://localhost:5000/process 的 POST 请求
单击“正文”选项卡并选择“x-www-form-urlencoded”的单选按钮。
输入一个新键“_csurf”并粘贴我们在 GET 请求中收到的字符串值。
如果您看到“正在处理数据”,那么您就知道它正在工作!
我制作了一个 YouTube 教程,以防万一这会让事情变得更容易: https://youtu.be/QruvuwM-kkU
【讨论】: