Estoy usando csurf como se recomienda en mi aplicación Express para protegerme contra las falsificaciones entre sitios. Lo he registrado globalmente (ilustrado con el código a continuación) y hasta ahora todo bien.
Ahora, agregué multer.js para poder cargar imágenes y, como lo recomienda su documentación, es más seguro adjuntar multer a cada ruta rápida que pretenda usar.
Ahora, cuando adjunto multer a mis rutas de carga, me encuentro con un 'Error prohibido: token csrf no válido' y realmente no sé por qué, según mi opinión, estoy enviando el formulario, como un token csrf adjunto.
A continuación se muestra mi código y realmente agradecería cualquier ayuda/sugerencia. Gracias a todos
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); 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);Supongo que el problema es que cuando carga un archivo, el tipo de contenido de la solicitud se convierte en multipart/form-data , y ya no puede simplemente pasar el token csrf a Express en el cuerpo.
Sin embargo, la API permite pasarlo en la URL. Intente pasar el token en el parámetro _csrf , que creo que debería resolver su problema. Simplemente publique el formulario en .../?_csrf={your_token} . Sin embargo, tenga en cuenta que esto es un poco menos seguro que pasar su token csrf en el cuerpo de la solicitud, y podría marcarse como una vulnerabilidad potencial en pruebas de penetración posteriores si alguna vez tiene una.
Alternativamente, para un poco más de seguridad, también puede pasarlo como un encabezado de solicitud, pero eso podría ser un poco más complicado en el lado del cliente. De acuerdo con los documentos , Express tomará el token de lo siguiente:
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. Por lo tanto, agregar un csrf-token también debería funcionar.
Descargo de responsabilidad: no conozco multer.js en absoluto y tengo muy poca experiencia con Express.