如果有人通过 Node js 应用程序中的 multer 将扩展名从 exe 更改为 png,则不应允许文件上传

2024-01-03

我正在使用上传文件multer在我的nodejs(express js)应用程序中,它运行良好。我在那里进行了 mime 类型检查,也只允许 png 文件,但如果我更改上传文件的扩展名abc.exe to abc.png它也会被上传,这是错误的。

这是我的代码。

var multer = require('multer');
var imagefolder = __base + 'public/complaintimages/';

var diskstorage = multer.diskStorage({
    destination: function (req, file, cb) {
        if (common.ImageMimeTypes.indexOf(file.mimetype) < 0) {
            common.ActionOutput.Status = common.ActionStatus.WrongFileUploaded;
            common.ActionOutput.Message = 'Invalid image file: ' + file.originalname;
            cb(new Error('FileUpload:' + common.ActionStatus.WrongFileUploaded), null);
        } else
            cb(null, imagefolder);
    },
    filename: function (req, file, cb) {
        var filenm = randomstring.generate(10);
        //console.log(filenm + file.originalname);
        cb(null, filenm + file.originalname);
    }
});
var upload = multer({
    storage: diskstorage
});

它应该检查文件内容的 MIME 类型。将 other 重命名为 png 则不应上传。这似乎是图书馆的错误。 请指教。


在您的路由处理程序中,当您拥有保存的文件名时,您可以使用mmmagic https://www.npmjs.com/package/mmmagic module:

var mmm = require('mmmagic'),
var magic = new mmm.Magic(mmm.MAGIC_MIME_TYPE);
magic.detectFile(fileName, function (err, mime) {
  if (err) {
    // handle error
  } else {
    // check the mime
    // and remove the file if you don't like it
    // plus send a correct response to the client
  }
});

Update

If mmmagic不适合你那么你可以使用file-type模块,但它适用于缓冲区,因此您首先必须将文件(或其某些部分)读入缓冲区并使用以下命令检查 mime 类型file-type. The read-chunk模块可以方便地读取部分文件。

See:

  • https://www.npmjs.com/package/file-type https://www.npmjs.com/package/file-type
  • https://www.npmjs.com/package/read-chunk https://www.npmjs.com/package/read-chunk
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果有人通过 Node js 应用程序中的 multer 将扩展名从 exe 更改为 png,则不应允许文件上传 的相关文章

  • 使用mockery和sinon模拟类方法

    我正在学习使用带有 sinon 的节点模块模拟进行单元测试 仅使用模拟和普通类 我就可以成功注入模拟 不过 我想注入一个 sinon 存根而不是一个普通的类 但我在这方面遇到了很多麻烦 我试图嘲笑的班级 function LdapAuth
  • 使用 FormData 上传 JavaScript Blob

    我在将 javascript 创建的 blob 上传到我的服务器时遇到问题 基本思想是用户上传图像 在 javascript 中我对图像进行居中裁剪并在传输之前对其进行下采样 图像处理工作正常 但上传本身无法正常工作 这是执行从 canva
  • 异步减少返回承诺

    我有一个对象数组 我必须为来自异步函数的每个对象添加一个属性 我正在执行 Array reduce 来迭代每个元素并仅返回一个结果 具有新属性的一个对象数组 我有这个 const res await resultOne reduce asy
  • express-session:滚动会话过期配置

    所以我在 mongo 商店中使用快速会话 如下所示 app use session secret some secret here saveUninitialized false resave false store new MongoSt
  • 茉莉花节点没有输出

    我是 JavaScript Node js 和 jasmine 的新手 我正在尝试运行 Node Craftsman Book 一书中的测试 FilesizeWatcher 我创建了 package json 文件并运行 npm insta
  • Blueimp jQuery 文件上传,传递额外的表单数据

    我可以使用一些帮助 我已经设法使 blueimp jQuery 文件上传为我工作 但我仍然绝对是一个新手 我对 jQuery 等知之甚少 所以请尝试将其清晰明了地提供给我尽可能简单 我会尝试具体一点 好的 我想实现的是人们可以上传照片 并为
  • Node.js 中的 Twilio 短信回复

    我正在使用 node js 中的 twilio 编写移动通知系统 目前可以向用户发送短信 但我希望用户能够回复我 我需要收集用户发送文本的电话号码以及消息的内容 以查询我的 mongoosedb 我找不到太多这方面的信息 因此非常感谢您的帮
  • 使用 dnode 从服务器向客户端发送消息

    几个月前 我发现了 nowjs 和 dnode 并最终使用了 nowjs 并且https github com Flotype nowclient https github com Flotype nowclient 用于客户端 服务器双向
  • 如何在浏览器同步中配置端口

    我有一个gulp任务运行于browser sync 默认情况下它运行在node js服务器的端口3000上 我想将默认端口更改为任何其他端口 例如3010 var gulp require gulp connect require gulp
  • 未处理的拒绝:发送后无法设置标头

    我正在 Dialogflow 中创建一个聊天机器人 当我尝试将数据添加到数据库时 它抛出了 未处理的拒绝 错误 这是我的index js文件 use strict const functions require firebase funct
  • 从 Node.js 调用 execl、execle、execlp、execv、execvP 或 execvp 的方法

    POSIX 系统公开了一系列exec函数 允许人们将可能不同的东西加载到当前进程中 保留打开的文件描述符 进程标识符等 可以出于多种原因执行此操作 在我的情况下 这是引导 我想更改我自己的进程的命令行选项 然后在现有进程上重新加载它 这样就
  • NodeJS os 模块无法使用 userInfo()

    https nodejs org api os html os os userinfo options https nodejs org api os html os os userinfo options 节点版本 v4 2 6 NPM版
  • Angular 和 Node JS 中的路由问题 [Angular]

    我有角度js的问题 我创建了 login html 和 home html 成功登录后我想将页面更改为 home html 我的路由不起作用 默认 url 是 localhost angular 我尝试路由 realpath 即 local
  • 将新属性动态添加到 Node 中现有的 JSON 数组中

    我需要添加当前 JSON 中不存在的属性 json 对象如下所示 var jsonObj result OK data 我想在 数据 中添加温度 我可以像下面那样做 jsonObj data push temperature 然后 我想在
  • Azure Functions [JavaScript / Node.js] - HTTP 调用,良好实践

    从我的 Azure 函数 在 Node js 中运行 由 EventHub 消息触发 中 我想向某个外部页面发出发布请求 就像是 module exports function context eventHubMessages var ht
  • 带有非字符串值的 AWS S3 x-amz-meta 错误:InvalidHeader 和 InvalidParameterType

    尝试使用node js AWS sdk时s3Client upload带有元数据的可选参数 const AWS require aws sdk const s3Client new AWS S3 params Key key secret
  • GraphQL - POST 正文丢失。您忘记使用 body-parser 中间件了吗?

    我的电脑上不断出现以下错误graphql查询但不确定原因 POST body missing Did you forget use body parser middleware 我在这里做了什么奇怪的事吗 我已经尝试了在线 body par
  • 如何在Sequelize中从主模型同一级别的包含模型返回结果?

    这是我在项目中完成的代码和结果 我想获得包含模型的结果与主模型相同的结果 下面的代码是我所做的 序列化查询 User findAll include model Position attributes POSITION NAME then
  • ColdFusion:上传前获取文件名

    在调用之前如何获取文件的文件名
  • 如何使用 afnetworking 在后台上传任务

    我正在尝试使用 AFNetworking 上传大文件 并在应用程序处于后台时继续上传 我可以很好地上传文件 但是当我尝试使用后台配置时 应用程序崩溃并显示以下堆栈跟踪 异常 EXC BAD ACCESS 代码 1 地址 0x8000001f

随机推荐

  • 将 ORM 合并到(半)SOA 架构中

    我正在探索 ORM 的产品 专注于 NHibernate 考虑所有选项 并且确信使用它可能会给我们的一些项目带来很大的好处 但是我很难想象它会如何发挥作用在我们的系统中 我的理解是 ORM 非常适合用于将数据库和业务逻辑粘合在一起 这假设业
  • Elasticsearch 中任意查询的“实际命中”(不仅仅是匹配文档)计数

    这真的让我很沮丧 我尝试寻找解决方案很长一段时间 但无论我在哪里尝试从提出相同问题的人那里找到问题 他们要么想要一些不同的东西 比如here https stackoverflow com questions 37734693 elasti
  • 如何使用选项卡更新滑动视图中的片段

    以下 我正在使用使用选项卡滑动视图 http developer android com training implementing navigation lateral html 到目前为止工作相当顺利 问题是 我有两个片段 选项卡 每个
  • 在node.js中获取上传的文件名/路径

    如何获取上传的文件名 路径的名称以在 Node js 中对其进行操作 我想将文件从临时文件夹移动到客户文件夹 Node JS 不会自动将上传的文件保存到磁盘 相反 您必须阅读并解析multipart form data通过以下方式满足自己r
  • 将 NASM 和 64 位 C 代码编译并链接到引导加载程序中 [重复]

    这个问题在这里已经有答案了 我制作了一个非常简单的一级引导加载程序 它执行两个主要操作 从 16 位实模式切换到 64 位长模式 并从硬盘读取接下来的几个用于启动基本内核的扇区 对于基本内核 我尝试用 C 而不是汇编编写代码 对此我有一些疑
  • Windows Metro 应用程序中没有 P2P?

    在 BUILD 的 NET 开发人员对 Windows 8 应用程序开发的看法 会议中 讲师提到 Metro 配置文件中仅公开了客户端 WCF 功能 我们无法创建服务器 http channel9 msdn com Events BUILD
  • 添加缓存到 Zend\Form\Annotation\AnnotationBuilder

    因为我终于找到了一个二进制文件memcache对于 Windows 上的 PHP 5 4 4 我正在加快我当前正在开发的应用程序的速度 我已经成功将 memcache 设置为 Doctrine ORM 映射缓存驱动程序 但我需要修复另一个泄
  • 标准化 Tensorflow 对象检测 API 的输入

    Tensorflow 对象检测 API 默认情况下是否会进行类似于输入标准化的预处理 我在任何地方都找不到任何有关它的文档 数据增强中有一个名为 NormalizeImage 的选项 在动物园模型的所有配置文件中 我从未看到它被使用过 下雨
  • 是否可以将文件组从一个数据库复制到另一个数据库?

    我想提取数据库的子集并复制到另一个服务器 数据库 是否可以从一个数据库复制 备份单个文件组并附加 恢复到另一个数据库 您无法将文件组恢复到不同的数据库中 任何还原操作都必须经历恢复阶段 此时针对还原的数据文件重播日志 并且新数据库将具有与还
  • 使用 Moq 模拟依赖属性

    如果我有一个类 它具有通过属性注入解决的依赖项 是否可以使用 Moq 来模拟该属性的行为 e g public class SomeClass empty constructor public SomeClass dependency pu
  • 字符串不变性。更改后是否必须将其重新分配给同一个变量?

    字符串是不可变的 这是否意味着我总是必须对传递给方法的字符串执行类似的操作 str str toLowerCase or is str toLowerCase 美好的 我尝试了第二个 但没有给我任何错误 为什么 字符串是不可变的 是的 你自
  • zend框架如何获取当前登录的用户详细信息

    我想获取在 zend 框架中登录我的网站的用户详细信息 您可以像这样获取存储在 Zend Auth 中的数据 identity Zend Auth getInstance gt getIdentity The identity变量现在应该包
  • 如何在 SwiftUI 中异步请求完成后调用函数?

    我有一个函数可以调用 2 种类型的 api 请求来获取我的应用程序中需要的一堆数据 在该函数中 我发出位置请求 然后对于响应中的每个位置 我发出不同的请求以获取该特定位置的详细信息 例如 如果请求 1 返回 20 个位置 则我的第二个请求将
  • 重写 BeanPropertyRowMapper 以支持 JodaTime DateTime

    我的域对象有几个 Joda TimeDateTime字段 当我使用 SimpleJdbcTemplate 读取数据库值时 病人病人 jdbc queryForObject sql new BeanPropertyRowMapper Pati
  • 断言和设置基数

    为什么下面的断言会失败 另外 如果我取消评论 为什么所有断言都有效ASSERT 0 第 22 行 function CountFactors i nat nat requires i gt 1 var a set b 1 lt b lt i
  • 排除版本中的列表参数用法:update-properties

    我的 pom 中有以下内容
  • 找不到入口符号_start

    我在 gcc 上编译的 c 代码给出了错误Cannot find entry symbol start defaulting to 00000 谁能告诉我为什么以及如何纠正它 命令行是arm none eabi gcc O3 march a
  • 更改有序列表上的编号?

    您可以更改有序列表的起始编号 如下所示 ol li item three li li item four li ol 但是有没有办法让列表项具有任意编号 而不仅仅是连续编号 ol li item two li li item six li
  • C# - 线程池与任务

    正如一些人可能在 NET 4 0 中看到的那样 他们添加了一个新的命名空间System Threading Tasks这基本上就是任务的意思 我只使用了几天 从使用 ThreadPool 开始 哪一种效率更高 资源消耗更少 或者只是整体更好
  • 如果有人通过 Node js 应用程序中的 multer 将扩展名从 exe 更改为 png,则不应允许文件上传

    我正在使用上传文件multer在我的nodejs express js 应用程序中 它运行良好 我在那里进行了 mime 类型检查 也只允许 png 文件 但如果我更改上传文件的扩展名abc exe to abc png它也会被上传 这是错