0

Expressjs 有 bodyParser 中间件,它可以处理文件上传,甚至可以将它们存储在选项中给定的目录中。但是在我的应用程序中,我想将文件存储在 Amazon S3 中,所以我基本上想将文件直接流式传输到 S3,而根本不必将其存储在本地。

但问题是文件的验证。我怎样才能确定这些文件都是图像。检查内容类型是不够好的选项,因为它可以被伪造。我想知道是否可以在将文件流式传输到 S3 后进行验证?我是从安全的角度问的。

存储图像后,我需要检索它以创建缩略图,文件上传后给出响应后如何异步执行?

4

1 回答 1

0

您的目标是相互矛盾的,即不想在上传过程中将其存储在本地,但又想再次不必要地下载以制作缩略图。如果您想获得技术灵巧奖,您可以同时将文件上传请求正文流式传输到本地临时文件以及 S3。或者,您可以像其他行业一样将其存储在本地临时文件中,然后对其进行缩略图,然后将所有尺寸上传到 S3。这些方法中的任何一种都减轻了立即从 S3 下载以制作缩略图的需要。

您打算如何验证它确实是一张图片?您可以查看文件数据的第一块并验证文件类型的幻数,如果这会给您带来温暖的模糊感,但最终它是不受信任的用户数据。假定图像文件的后半部分可能是病毒代码,并且在Content-Type标题处很容易伪造。听起来您的安全问题主要是由FUD驱动的,而不是您打算防御的特定威胁。只要您不获取用户上传的数据,将其标记为可执行并在您的服务器上以 root 身份运行,任何非图像数据都会损坏并且无法在浏览器中正确呈现(和/或导致您的thumbnailer 程序以错误退出或在极端情况下可能崩溃)。

关于验证,我可以尝试创建一个缩略图,如果我不能,那么它不是有效的图像并将其删除。这条路好吗?

大多数时候,是的。在某些极端情况下,您的缩略图无法处理图像,但浏览器可以处理,因为缩略图并不完美,并且某些图像已部分损坏。例如,我发现一些动画 GIF 在 Web 浏览器中渲染和动画效果很好,但 graphicsmagick 试图处理它们时崩溃。不确定对于那些 0.01% 的边缘情况可以做些什么。

对于上传部分,我可以向用户发送响应,然后继续创建缩略图并将其存储在 S3 中吗?

是的,这通常是最好的方法,这样用户就知道他们的上传成功了。通常,图像处理通常被构建为“工作队列”模型,您只需记录有工作要做,然后继续,一个或多个单独的进程将工作从队列中取出并完成它。

于 2013-07-12T08:46:16.620 回答