如何使用Express安全地上传Node中的文件?

Mar*_*hdy 6 file-upload node.js express formidable

有许多关于文件上传的文章,教程和问题,但主要是针对初学者,没有一个完整地解释了如何保护文件上传以进行生产.我已经非常努力地找到关于如何做到这一点的完整答案,但它没有成功.

以下是我的发现的解释.

  1. 上传时限制文件大小:

    app.use(express.limit('4mb'));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将文件上传限制为仅限某些路线:我无法将其实际工作,但这是我尝试过的:

    更换:

    app.use(express.bodyParser());
    
    Run Code Online (Sandbox Code Playgroud)

    app.use(express.json());
    app.use(express.urlencoded());
    
    Run Code Online (Sandbox Code Playgroud)

    并将多部分中间件添加到每个上传路由:

    app.post('/upload', express.multipart(), uploadController.uploadPhoto);
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    我无法理解这一部分,但建议是编写一个自定义中间件,使用强大的内容来解析文件上传,并尝试在文件保存之前调整文件大小(假设它是图像),使用像图像魔术这样的库.建议这将使图像安全并确保它实际上是一个图像(因为如果它不是图像,该过程将失败).

    这只适用于图像,因此它不是一个完整的解决方案.

    我该如何实现呢?任何示例代码?

我上传的其他内容是否安全?

Mar*_*hdy 2

方法2确实有效。我遇到的问题是

app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)

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


我最终使用了这个插件

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

它非常适合图像上传,并自动将文件大小调整为多个版本并将它们上传到亚马逊 s3。使用此插件与使用方法 3 是一致的,但文件会tmp先上传到文件夹,然后再删除。