【问题标题】:uploading files using express.js and node, limiting extensions使用 express.js 和 node 上传文件,限制扩展
【发布时间】:2012-07-12 13:06:37
【问题描述】:

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

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

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

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

谢谢,

【问题讨论】:

    标签: image node.js file-upload express


    【解决方案1】:

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

    根据formidable docs,可以通过自己的onPart处理程序:

    incomingForm.onPart(part)

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

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

    如果你想使用 formidable 只为你处理某些部分,你可以这样做:

    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) 我应该如何处理不支持的格式?一个 else { res.send(403) } ?
    • 我不确定part 中有哪些内容,但如果您有内容类型,我会与之进行比较。关于您将如何处理else 案例,我不确定您有什么选择。您实际上无法访问那里的res,而且我不知道如何处理它。在我上面的例子中,我认为它会忽略文件。
    • 哦,对于没有文件名的情况,您可能还应该使用this.handlePart(part) -- 我已经更新了答案。
    • 很高兴知道。当文件与扩展名不匹配时,强大似乎只是忽略文件。但是,通知我的应用程序的其余部分并相应地发送响应仍然会很好。
    【解决方案2】:

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

    在你的中间件中,

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 2012-08-18
      • 2011-11-17
      • 2012-11-02
      相关资源
      最近更新 更多