Image 使用express.js和node上传文件,限制扩展名

Image 使用express.js和node上传文件,限制扩展名,image,node.js,file-upload,express,Image,Node.js,File Upload,Express,我正在使用express.js和node处理文件上传,基本功能正常。我需要的是实施一些安全措施——即,将上传限制为某些格式(PNG、JPEG)。是否有一种简单的方法只允许某些格式?它会进入主体解析器吗 app.use(express.bodyParser({ uploadDir: __dirname + '/public/uploads', keepExtensions: true })); app.use(express.limit('4mb')); 我还应该考虑其他安

我正在使用express.js和node处理文件上传,基本功能正常。我需要的是实施一些安全措施——即,将上传限制为某些格式(PNG、JPEG)。是否有一种简单的方法只允许某些格式?它会进入主体解析器吗

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

app.use(express.limit('4mb'));
我还应该考虑其他安全措施吗?从图像中擦除EXIF数据通常是一个好主意吗

谢谢


Ben

我找到了一个潜在的解决方案:

在您的中间件中

    if (req.files[key].type != 'image/png' && req.files[key].type != 'image/jpeg'){
      res.send(403);
    } else {
      next(); 
    }
更新:但这实际上并没有阻止文件上传

根据,任何选项也会传递给执行实际表单解析的

根据,您可以传递自己的
onPart
处理程序:

部分收入

如果您对直接访问多部分流感兴趣,可以覆盖此方法。这样做将禁用否则将发生的任何“字段”/“文件”事件处理,使您完全负责处理该处理

incomingForm.onPart = function(part) {
  part.addListener('data', function() {
    // ...
  });
}
如果您想使用“强大”仅为您处理某些零件,您可以这样做:

incomingForm.onPart = function(part) {
  if (!part.filename) {
    // let formidable handle all non-file parts
    incomingForm.handlePart(part);
  }
}
综上所述,您应该能够做到以下几点:

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

app.use(express.bodyParser({onPart: onPart});

警告:我还没有测试过任何一个。

这很好,Linus,看起来很有效。两个问题:(1)比较内容类型和文件名是否更好?(2) 我应该如何处理不支持的格式?还有一个{res.send(403)}吗?我不确定
部分中有什么可用的内容,但是如果您有内容类型,我会与它进行比较。关于您将如何处理
else
案例,我不确定您有什么选择。你真的无法访问那里的
res
,我也不知道这是如何处理的。在我上面的例子中,我认为它只会忽略文件。哦,对于那些没有文件名的情况,您可能也应该执行
this.handlePart(part)
,我已经更新了答案。很高兴知道。当文件与扩展名不匹配时,它似乎会忽略该文件。但是,如果能将这一点告知我的应用程序的其他部分,并发送相应的响应,那就太好了。