subir archivos usando Express.js y node, limitando las extensiones

Estoy trabajando en el manejo de cargas de archivos utilizando Express.js y node, y tengo la funcionalidad básica funcionando. Lo que necesito es implementar algunas medidas de seguridad, a saber, limitar las cargas a ciertos formatos (PNG, JPEG). ¿Hay una manera fácil de permitir solo ciertos formatos? ¿Iría en el body-parser?

app.use(express.bodyParser({ uploadDir: __dirname + '/public/uploads', keepExtensions: true })); app.use(express.limit('4mb')); 

¿Hay alguna otra medida de seguridad que deba tener en cuenta? ¿Es generalmente una buena idea borrar los datos EXIF ​​de la imagen?

Gracias,

Ben

De acuerdo con la documentación para el bodyParser de bodyParser , cualquier opción también se pasa a formidable , que realiza el análisis de la forma real.

De acuerdo con documentos formidables , puede pasar su propio controlador onPart :

incomingForm.onPart (parte)

Puede sobrescribir este método si está interesado en acceder directamente a la secuencia de varias partes. Si lo hace, se deshabilitará el procesamiento de eventos de ‘campo’ / ‘archivo’ que, de lo contrario, se produciría, lo que lo hace totalmente responsable de manejar el procesamiento.

 incomingForm.onPart = function(part) { part.addListener('data', function() { // ... }); } 

Si desea utilizar formidable para manejar solo ciertas partes por usted, puede hacerlo:

 incomingForm.onPart = function(part) { if (!part.filename) { // let formidable handle all non-file parts incomingForm.handlePart(part); } } 

Tomados en conjunto, deberían poder hacer algo como esto:

 function onPart(part) { if(!part.filename || part.filename.match(/\.(jpg|jpeg|png)$/i)) { this.handlePart(part); } } app.use(express.bodyParser({onPart: onPart}); 

Advertencia: no he probado nada de esto.

Encontré una solución potencial:

En tu middleware,

  if (req.files[key].type != 'image/png' && req.files[key].type != 'image/jpeg'){ res.send(403); } else { next(); } 

actualización: esto realmente no detiene la carga del archivo, sin embargo.