2013-01-22 109 views
6

在节点中有很多关于文件上传的文章,教程和问题,但主要是针对初学者,并且他们中没有一个完全解释了如何保护生产文件上传。 我已经很努力地找到一个完整的答案,如何做到这一点,但它没有成功。如何使用Express在Node中安全地上传文件?

下面是我的发现的解释。在上传

  1. 限制文件大小:

    app.use(express.limit('4mb')); 
    
  2. 限制文件上传到只有特定的路线: 我不能让这种实际工作,但这里是我曾尝试:

    替换:

    app.use(express.bodyParser()); 
    

    app.use(express.json()); 
    app.use(express.urlencoded()); 
    

    和多中间件添加到每个上传路线:

    app.post('/upload', express.multipart(), uploadController.uploadPhoto); 
    

    这部分不工作,但如果我离开express.bodyParser()上传工作正常。那么我做错了什么?

  3. 检查上传的文件类型上传保存到磁盘之前:

    我想不出这部分,但是一个建议是,编写使用强大的解析文件上传自定义的中间件,并试图调整文件之前它被保存(假设它是一个图像)使用图像魔法库。建议这样做会使图像安全并确保它实际上是一个图像(因为如果图像不是图像,该过程会失败)。

    这只适用于图像,所以它不是一个完整的解决方案。

    我该如何执行此操作?任何示例代码?

还有什么我缺少的上传是安全的吗?

+0

3将要走的路,假设2不工作。如果是这样,那将是理想的解决方案。 –

+0

从我读的2应该工作,我做错了什么?你也有任何如何做3的例子吗?我试图做到这一点,但没有成功。我发现的大部分代码都无法与新版本的快递 –

+0

一起使用请问您可以使用2创建最小的项目,并可能在github上共享代码。我会看看它。如果它不起作用,我会为你建立3并分享。 –

回答

2

方法2实际工作。我遇到的问题是,

app.use(passport.session()); 

正在阻止它的工作。因此,如果您使用passport.js进行身份验证,则可能是此问题。如果您使用这种方法,请确保在实际路线上添加安全性。


最后我使用这个插件

https://github.com/tih-ra/alleup

伟大的工程与图片上传,并自动将文件调整大小以多个版本,并上载他们到Amazon S3。使用此插件将与使用方法3一起内嵌,但文件首先会上载到tmp文件夹中,然后再删除。

+0

我以为你原来的问题是关于保护文件上传的路径。例如,假设某人发布了一个文件附加到路径'/ restricted-path'的多部分表单,那么你会怎么做? –

+0

以及该插件使用强大的处理文件上传和工作表达多部分不应该使用,因此上传不能张贴到任何路线。我有另一个问题,虽然passport.session()停止从触发文件事件强大http://stackoverflow.com/questions/14479343/in-node-js-why-does-passport-session-stop-formidable-from-triggering - 文件 - 甚至所以我要么解决这个问题,要么弄清楚如何做数字2. –

+0

好吧,所以我想出了app.use(passport.session())是什么使2号不起作用。我认为这是与passport.session()相关的事情,需要在multipart之后调用,而不是之前。我仍然不确定如何通过路线基地 –

1

我正在使用multiparty上传(和流式传输)文件。

var form = new multiparty.Form();

为1:

form.on('progress', function (bytesReceived) { 
    if (262144000 < bytesReceived) { 
    abortConnection('filesizeexeeded'); 
    } 
}); 

实现自己的中止连接功能;例如: -

function abortConnection(reason) { 
    res.writeHead(413, { 'Connection': 'close' }); 
    return res.end(reason); 
} 

警告:浏览器将最有可能重试上传(最多4次)。我正在使用websocket连接取消客户端的上传。

至2:(使用多方)

至3:我创建了一个gist,说明如何检查使用mmmagic运行中的MIME类型。

如果您在与多方联合使用的护照,你可能会发现这个有用:

https://github.com/jaredhanson/passport/pull/106#issuecomment-14188999

+0

似乎很好,但如何在使用multipaty时获得文件流?很久以前我有这个问题,但我仍然无法找到答案。 –