node.js - 安全的图像文件上传

Posted

技术标签:

【中文标题】node.js - 安全的图像文件上传【英文标题】:node.js - secure image file upload 【发布时间】:2013-07-16 04:13:09 【问题描述】:

我们必须为 node.js 项目实现一个图片上传器。作为我们使用 express.js 的框架,我们按照此处描述的方式进行操作:http://howtonode.org/really-simple-file-uploads

但我们不确定如何保护此图片上传器。到目前为止,我们所做的是:

检查文件大小 检查扩展和标题 重命名文件 文件只能通过特殊路径访问,并且不在根文件夹中

这就够了吗?我们对下面这行不太满意:

    // CHECKING FOR FILESIZE, EXTENSION, HEADERS
    fs.readFile(req.files.displayImage.path, function (err, data) 
        ...
        ...
        ...
        // RENAMING FILE
        // SAVE FILE
        ...
        ...
        ...
    

这样读图省事吗?我们担心,req.files.displayImage.path 中可能存在恶意代码。我们是否需要添加更多检查或我们的检查是否足够?如果我们使用所描述的代码,我们会为攻击者提供哪些攻击向量?

感谢您的建议 乔尔茨基

【问题讨论】:

将字节读入Buffer不能执行恶意代码。 感谢您的回答。但是我们将文件读入缓冲区,然后将其保存到磁盘。那么如果我们将带有恶意代码的图像保存到磁盘会出现什么问题呢? 将字节写入磁盘无法执行恶意代码。当您尝试解释字节并出现错误时,就会发生安全漏洞。 也感谢您的建议。就我们看到的问题而言,我们的服务器没有很大的安全隐患,因为我们不对图像的字节做任何事情。但是获取图像的用户是否存在安全风险?因为我们将图像交付给多个用户,而我们的服务器不会成为恶意代码的分发者!我们在某处读到,重新处理图像是个好主意,但我们不知道这是如何删除恶意代码的。 好的,那么您可以选择在我们的服务器上打开一个可能的漏洞利用或向用户提供恶意代码。大玩家如何处理这样的事情会很有趣。那么是否可以通过例如分发带有恶意代码的图像? Facebook 还是 Tumblr?出现了一个问题:“对于两个人的项目来说,将安全风险转移给用户而不在服务器上处理图像是否更好?” 【参考方案1】:

如果您担心在客户端打开您的 cmets 中发布的恶意图像。尝试在沙盒 iframe 中打开第三方脚本和不受信任的文件,这将保护您的用户。

【讨论】:

以上是关于node.js - 安全的图像文件上传的主要内容,如果未能解决你的问题,请参考以下文章

如何使用其他字段进行文件上传,例如:使用 Vue.js 在 Node.js 中的标题、名称、图像、image2

如何使用 ios 应用程序将图像上传到 Node.JS 服务器

将具有特定public_id的图像上传到Cloudinary到特定文件夹(node.js)

如何使用 node.js 获取图像上传进度并在我的 iphone 应用程序中使用它

node.js / react 使用 graphql createReadStream 上传文件不是函数

从 url 下载文件并将其上传到 AWS S3 而不保存 - node.js