5

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

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

app.use(express.limit('4mb'));

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

谢谢,

4

2 回答 2

6

根据connect's 的文档bodyParser,任何选项也会传递给强大的,它会执行实际的表单解析。

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

传入Form.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});

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

于 2012-07-12T19:26:34.313 回答
2

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

在您的中间件中,

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

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

于 2012-07-12T18:18:33.493 回答