Getting ForbiddenError: invalid csrf token with multer added locally to image upload router
Getting ForbiddenError: invalid csrf token with multer added locally to image upload router
我正在使用我的 Express 应用程序中推荐的 csurf 来防止跨站点伪造。我已经在全球范围内注册了它(如下面的代码所示),到目前为止一切顺利。
现在,我添加了 multer.js 以便能够上传图片,并且正如他们的文档所建议的那样,将 multer 附加到您打算使用的每条快速路线会更安全。
现在,当我将 multer 附加到我的上传路径时,我遇到了一个 'ForbiddenError: invalid csrf token' 我真的不知道为什么,因为我认为我正在提交表单,作为附加的 csrf 令牌
下面是我的代码,我非常感谢任何 help/suggestions。谢谢大家
app.js
const express = require('express');
const csrf = require('csurf');
const csrfProtection = csrf();
const shopRoute = require('../Routes/shop');
const app = express();
app.use(csrfProtection);
app.use(shopRoutes);
routes.js
const express = require('express')
const router = express.Router();
const multer = require('multer');
const controllers = require('../Controllers/shop');
router.post('/upload', multer({storage: multer.memoryStorage(), fileFilter: fileFilter), controller.uploadFunction);
我猜问题是当你上传文件时,请求的内容类型变成了multipart/form-data
,你不能简单地将csrf token传递给body中的Express没有了。
API 允许在 URL 中传递它。尝试在 _csrf
参数中传递令牌,我认为这应该可以解决您的问题。所以简单地 post 形式到 .../?_csrf={your_token}
。请注意,尽管这比在请求中传递您的 csrf 令牌安全性略低 body,并且如果您有的话,可能会在以后的渗透测试中被标记为潜在漏洞。
或者,为了更加安全,您也可以将其作为请求传递 header,但这在客户端可能有点棘手。根据docs,Express会从以下取token:
req.body._csrf - typically generated by the body-parser module.
req.query._csrf - a built-in from Express.js to read from the URL query string.
req.headers['csrf-token'] - the CSRF-Token HTTP request header.
req.headers['xsrf-token'] - the XSRF-Token HTTP request header.
req.headers['x-csrf-token'] - the X-CSRF-Token HTTP request header.
req.headers['x-xsrf-token'] - the X-XSRF-Token HTTP request header.
所以添加 csrf-token
header 应该也可以。
免责声明:我根本不知道 multer.js,对 Express 的经验也很少。
我正在使用我的 Express 应用程序中推荐的 csurf 来防止跨站点伪造。我已经在全球范围内注册了它(如下面的代码所示),到目前为止一切顺利。
现在,我添加了 multer.js 以便能够上传图片,并且正如他们的文档所建议的那样,将 multer 附加到您打算使用的每条快速路线会更安全。
现在,当我将 multer 附加到我的上传路径时,我遇到了一个 'ForbiddenError: invalid csrf token' 我真的不知道为什么,因为我认为我正在提交表单,作为附加的 csrf 令牌
下面是我的代码,我非常感谢任何 help/suggestions。谢谢大家
app.js
const express = require('express');
const csrf = require('csurf');
const csrfProtection = csrf();
const shopRoute = require('../Routes/shop');
const app = express();
app.use(csrfProtection);
app.use(shopRoutes);
routes.js
const express = require('express')
const router = express.Router();
const multer = require('multer');
const controllers = require('../Controllers/shop');
router.post('/upload', multer({storage: multer.memoryStorage(), fileFilter: fileFilter), controller.uploadFunction);
我猜问题是当你上传文件时,请求的内容类型变成了multipart/form-data
,你不能简单地将csrf token传递给body中的Express没有了。
API 允许在 URL 中传递它。尝试在 _csrf
参数中传递令牌,我认为这应该可以解决您的问题。所以简单地 post 形式到 .../?_csrf={your_token}
。请注意,尽管这比在请求中传递您的 csrf 令牌安全性略低 body,并且如果您有的话,可能会在以后的渗透测试中被标记为潜在漏洞。
或者,为了更加安全,您也可以将其作为请求传递 header,但这在客户端可能有点棘手。根据docs,Express会从以下取token:
req.body._csrf - typically generated by the body-parser module.
req.query._csrf - a built-in from Express.js to read from the URL query string.
req.headers['csrf-token'] - the CSRF-Token HTTP request header.
req.headers['xsrf-token'] - the XSRF-Token HTTP request header.
req.headers['x-csrf-token'] - the X-CSRF-Token HTTP request header.
req.headers['x-xsrf-token'] - the X-XSRF-Token HTTP request header.
所以添加 csrf-token
header 应该也可以。
免责声明:我根本不知道 multer.js,对 Express 的经验也很少。