Expressjs有bodyParser中间件,它可以处理文件上传,甚至可以将它们存储在选项中给出的目录中。但在我的应用程序中,我想将文件存储在Amazon S3中,因此我基本上希望将文件直接流式传输到S3,而不必将其存储在本地。
但问题是验证文件。我怎么能确定这些文件都是图像。检查内容类型是不够好的选项可以伪造。 我想知道如果我在将文件流式传输到S3之后进行验证是否可以?我从安全的角度提问。
存储图像后,我需要检索它以创建缩略图,如何在文件上传后给出响应后异步执行?
答案 0 :(得分:0)
你有一个相互矛盾的目标,即不希望在上传过程中将其存储在本地,但又想再次不必要地下载它来制作缩略图。如果您想获得技术灵活性奖励,您可以同时将文件上传请求正文流式传输到本地临时文件以及S3。或者您可以执行其他行业所做的事情并将其存储在本地临时文件中,然后将其缩略图,然后将所有大小上传到S3。这些方法中的任何一种都无需立即从S3下载它来制作缩略图。
您打算如何确认它真的是一张图片?您可以查看第一块文件数据并验证the file type's magic number是否为您提供了温暖的模糊,但最终它是不受信任的用户数据。假定的图像文件的后半部分可能是病毒代码,而且在Content-Type
标题处也很容易伪造。听起来您的安全问题主要由FUD驱动,而不是您打算防范的特定威胁。只要您不接受用户上传的数据,将其标记为可执行文件并在服务器上以root身份运行,任何非图像数据都将损坏并且无法在浏览器中正确呈现(和/或导致您的thumbnailer程序退出时出现错误或者在极端情况下崩溃。)
关于验证我可以尝试创建一个缩略图,如果我不能,那么它不是一个有效的图像并删除它。这样好吗?
大多数时候,是的。会出现边缘情况,您的缩略图无法处理图像,但浏览器可能因为缩略图不完美而某些图像部分损坏。例如,我发现了一些动画GIF,它们可以在Web浏览器中渲染和制作动画,但是图形拼图会在尝试处理它们时崩溃。不确定那些0.01%边缘情况可以做些什么。
对于上传部分,我可以向用户发送响应,然后继续创建缩略图并将其存储在S3中吗?
是的,这通常是最好的方法,因此用户知道他们的上传成功了。通常,图像处理通常被构建为“工作队列”模型,您只需记录有待完成的工作然后继续进行,并且一个或多个单独的流程将从队列中取出并完成它。