【问题标题】:How to set CSURF (Express Middleware) up to work with Postman?如何设置 CSURF (Express Middleware) 以与 Postman 一起工作?
【发布时间】:2021-02-24 01:26:44
【问题描述】:

根据 CSURF 文档,您如何设置工作服务器以在 Postman 中测试 CSURF: http://expressjs.com/en/resources/middleware/csurf.html

【问题讨论】:

    标签: node.js express postman


    【解决方案1】:

    感谢您的提问和回答,它帮助解决了设置 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 等的请求)并且在每次调用后都不同 使用标头有其他选择(可以使用正文属性或查询),但使用标头似乎更干净,尤其是在使用 JSON 时

    一个。在 Postman 上设置并发送 GET 请求(因为 get 请求默认不检查 csrf)

    b.在 Postman 中设置 POST 请求,使用 GET 请求中的 cookie 值设置此标头

    XSRF-Token   abc123...
    

    *注意连字符 (-),而不是下划线 (_)

    4。在 Postman 中自动设置标题

    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 中发布您心中的内容了

    【讨论】:

    • 干得好,感谢您的积极反馈 :-)
    【解决方案2】:

    我不得不重新学习几次,所以我认为每个人都可以方便地查看故障:

    在您的服务器中:

    在 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;
    

    启动你的服务器

    在邮递员中:

    GET 请求:

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

    点击“发送”。在请求信息下方,您应该在响应数据中看到以下内容:

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

    POST 请求:

    设置对 http://localhost:5000/process 的 POST 请求

    单击“正文”选项卡并选择“x-www-form-urlencoded”的单选按钮。

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

    您的 POST 请求现在应该如下所示:

    点击“发送”。您现在应该看到以下信息:

    如果您看到“正在处理数据”,那么您就知道它正在工作!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-16
      • 2020-05-15
      • 2014-07-31
      • 2017-10-14
      • 2021-12-02
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      相关资源
      最近更新 更多