如何设置CSURF(Express中间件)以便与Postman一起使用?

3
2个回答

6

感谢您的问题和回答,它有助于解决设置Postman的难题的一部分。我发表自己的答案以澄清一些问题,同时还可以将令牌自动复制到Postman请求中。

1. 首先使用Cookie解析器

app.use(cookieParser())

2. 发送_csrf cookie

app.use(csrf({ cookie: { httpOnly: true, }}))

这将返回Cookie 1: _csrf。

httpOnly的使用是推荐的,因为它可以将cookie保护在JavaScript无法访问的范围之外,更加安全。

3. 发送XSRF-Token Cookie

设置第二个cookie,需要在每个请求中返回。

app.use((req, res, next) => {
  res.cookie('XSRF-TOKEN', req.csrfToken())
  next()
})

4. 返回 XRSF-Token* 头

这需要在每个请求上都设置(使用 POST、DELETE 等方法时),并且每次调用后都会更改

虽然可以使用其他方式(如 body 属性或查询参数)来处理 CSRF,但使用头部似乎更为简洁,特别是在使用 JSON 时。

a. 在 Postman 中设置并发送 GET 请求(因为默认情况下 GET 请求不检查 CSRF)

b. 在 Postman 中设置一个 POST 请求,并使用从 GET 请求中获取的 cookie 值设置此头部。

XSRF-Token   abc123...

*注意破折号(-),而不是下划线(_)

4. 在Postman中自动设置标头

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}}

现在您应该可以在Postman中尽情地进行POST操作了。

1
干得好,感谢您的积极反馈 :-) - JimmyTheCode

3

我曾多次重新学习这个,所以我认为让每个人看到拆分过程会很方便:

在您的服务器中:

在index.js中:

const app = require('./app')

app.set('port', 5000);

app.listen(app.get('port'), () => {
    console.log('App running on port', app.get('port'));
});

在app.js文件中:
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;

启动服务器

在Postman中:

GET请求:

向http://localhost:5000/form发送GET请求 Postman GET request

点击“发送”。在请求信息下面,您应该可以看到响应数据中包含以下内容: enter image description here

复制引号之间的字符串。(在此示例中:H3DsAwqv-FuM06caBMOh6QZRFaILYgFyqFlA)

POST请求:

设置一个POST请求到http://localhost:5000/process

enter image description here

点击“Body”标签并选择“x-www-form-urlencoded”的单选按钮。

输入一个新键“_csurf”,并粘贴我们在GET请求中收到的字符串值。

现在您的POST请求应该如下所示: enter image description here

点击“发送”。您现在应该可以看到如下信息: enter image description here

如果您看到“正在处理数据”,则说明它正在工作!

我制作了一个YouTube教程,以防这让事情变得更容易: https://youtu.be/QruvuwM-kkU


发送res.send({csrfToken: req.csrfToken() })响应中的csrfToken是否推荐?没有cookie和策略吗? - 0xAnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接