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

时间:2012-07-12 17:50:01

标签: 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'));

我是否应该考虑其他任何安全措施?从图像中擦除EXIF数据通常是个好主意吗?

谢谢,

2 个答案:

答案 0 :(得分:5)

根据documentation for connect's bodyParser,任何选项也会传递给formidable,它会进行实际的表单解析。

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

  

incomingForm.onPart(部分)

     

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

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});

警告:我没有测试过这些。

答案 1 :(得分:2)

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

在您的中间件中,

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

更新:但这实际上并没有阻止文件上传。