【问题标题】:Invalid csrf token issue express nodejs无效的 csrf 令牌问题 express nodejs
【发布时间】:2021-01-02 09:24:24
【问题描述】:

我第一次尝试实现 csrf 令牌,但遇到了问题。我已经为此工作了几个小时,但无法解决它。以下是我得到的错误:

ForbiddenError: invalid csrf token

app.js

const express = require('express')
const app = express()
const router = require('./router')
const cookieParser = require('cookie-parser')
const session = require('express-session')
const flash = require('connect-flash')
const dotenv = require('dotenv')
const csrf = require('csurf')
dotenv.config()

app.use(express.urlencoded({extended: false}))
app.use(express.json())
app.use(express.static('public'))
app.use(cookieParser('secret'))
app.use(session({
    secret: 'secret',
    cookie: {maxAge: null},
    resave: false,
    saveUninitialized: false
}))

app.use(flash())
app.set('views', 'views')
app.set('view engine', 'ejs')

app.use(csrf())
app.use(function(req, res, next) {
    res.locals.csrfToken = req.csrfToken()
    next()
})
app.use('/', router)


app.use(function (req, res, next) {
    res.status(404).render('404')
  })
app.use(function (err, req, res, next) {
    console.error(err.stack)
    res.status(500).render('404')
})

app.listen(process.env.PORT)

router.js

const express = require('express')
const multer = require('multer')
const multerConfigOpts = require('./multer.config')
const router = express.Router()
const userController = require('./controllers/userController')
const csrf = require('csurf')
var csrfProtection = csrf({ cookie: true })
// set multer configuration options
const upload = multer(multerConfigOpts)


router.get('/', userController.home)
router.get('/about', userController.about)
router.get('/employer', userController.employer)
router.get('/jobSeeker', userController.jobSeeker)
router.get('/ourProcess', userController.process)
router.get('/contact', userController.contactUs)

// Talent Request Post related routes
router.post('/talentrequest',upload.none() ,userController.requestTalent)

// Job Request Post related routs
router.post('/jobrequest', csrfProtection, upload.single('resume'), userController.requestJob)

module.exports = router

我的表单示例:

            <form action="/jobrequest" method="POST" enctype="multipart/form-data">
                <input type="hidden" name="_csrf" value="<%= csrfToken %>">
                <button type="submit" class="btn--form-submit">Submit</button>
                </div>
            </form>

还有更多的数据字段,我只是不想用不必要的代码使问题变得臃肿。我一直在阅读其他人在表单中使用 multipart 时遇到类似问题,但我似乎无法弄清楚。

我知道我的令牌是在表单中生成的,但我不确定它是否被正确传递。任何帮助或指示将不胜感激。谢谢

【问题讨论】:

    标签: node.js express csrf multer


    【解决方案1】:

    所以我能够通过将以下内容添加到我的表单并从我的表单中删除 input hidden field 来找到解决方案

    form action="/talentrequest/*?_csrf=<%= csrfToken %>*" method="POST" enctype="multipart/form-data">
    

    一切正常。谁能解释一下这涉及的潜在风险?

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 2021-06-19
      • 2016-01-02
      • 2015-08-24
      • 1970-01-01
      • 2020-01-02
      • 2016-02-24
      • 2017-07-15
      • 2014-03-22
      相关资源
      最近更新 更多