当前位置:

首页 > 编程开发 > 在Node.js文件上传中集成ClamAV扫描的详细步骤

在Node.js文件上传中集成ClamAV扫描的详细步骤

Node.js文件上传中,pompelmi库集成ClamAV扫描,可在文件落盘前基于退出码返回Verdict枚举,避免stdout解析。支持本地clamscan与远程clamdTCP连接,零运行时依赖且跨平台,高效防御恶意文件上传。

本文目录

    文件上传一直是应用安全里最容易被忽视的攻击面。用户上传的东西,可能表面上是个PDF,底层却藏着恶意脚本、ZIP冲击波,甚至只是改了个后缀名的可执行文件。很多Node.js项目只做扩展名白名单检查——说实话,这跟没检查区别不大。

    在Node.js文件上传中集成ClamA V扫描的详细步骤

    这里要聊的 pompelmi 是一个轻量级的 Node.js 库,它的设计思路很实在:在文件真正落盘之前就完成病毒扫描,返回一个类型化的 verdict symbol。不依赖任何第三方运行时,也不需要额外安装复杂的杀毒引擎——当然,ClamA V 本身还是得装的。

    工作原理

    核心逻辑简单到可以用三句话讲清楚:

    1. 验证传入参数是否为字符串,以及文件是否存在
    2. 通过 child_process 调用 clamscan,直接读取退出码
    3. 把退出码映射成预定义的 Symbol

    没有 stdout 解析,没有正则匹配,没有隐式状态。简洁,但足够可靠。

    安装

    前提条件:Node.js 和 ClamA V。先装依赖包:

    npm install pompelmi

    然后安装 ClamA V,不同系统的命令略有差异:

    # macOS
    brew install clama v && freshclam
    # Debian / Ubuntu
    sudo apt-get install -y clama v clama v-daemon && sudo freshclam
    # Windows
    choco install clama v -y

    基本用法

    调用 scan 函数后得到一个 verdict,通过比较 Verdict 枚举值来决定下一步动作:

    const { scan, Verdict } = require('pompelmi');
    
    const result = await scan('/path/to/file.zip');
    
    switch (result) {
      case Verdict.Clean:
        // 文件安全,继续处理
        break;
      case Verdict.Malicious:
        throw new Error('检测到恶意软件,文件已拒绝');
      case Verdict.ScanError:
        // 扫描未完成,按不可信文件处理
        console.warn('扫描失败,拒绝文件');
        break;
    }

    返回值与 ClamA V 退出码的对应关系如下表:

    结果ClamA V 退出码含义
    Verdict.Clean0未发现威胁
    Verdict.Malicious1匹配到已知病毒签名
    Verdict.ScanError2扫描本身失败,文件状态未知

    在 Express 中集成

    实际项目里最常见的场景就是配合 Express + Multer 做上传接口。代码结构很清晰:先扫描临时文件,根据 verdict 决定是保留还是删除并返回错误。注意,扫描失败和检测到恶意软件都返回 422,但语义不同,客户端可以根据 error 信息区分。下面是一个完整的示例:

    const express = require('express');
    const multer  = require('multer');
    const { scan, Verdict } = require('pompelmi');
    const path = require('path');
    const fs   = require('fs');
    
    const app    = express();
    const upload = multer({ dest: 'tmp/' });
    
    app.post('/upload', upload.single('file'), async (req, res) => {
      const filePath = path.resolve(req.file.path);
      try {
        const result = await scan(filePath);
        if (result === Verdict.Malicious) {
          fs.unlinkSync(filePath);
          return res.status(422).json({ error: '文件包含恶意软件' });
        }
        if (result === Verdict.ScanError) {
          fs.unlinkSync(filePath);
          return res.status(422).json({ error: '扫描失败,文件已拒绝' });
        }
        // Verdict.Clean — 继续保存文件
        return res.status(200).json({ verdict: 'clean' });
      } catch (err) {
        fs.unlinkSync(filePath);
        return res.status(500).json({ error: err.message });
      }
    });

    远程扫描(Docker)

    如果你的 ClamA V 运行在容器或远程服务器上,可以通过 TCP socket 连接。只需要在 scan 的第二个参数中传入 host 和 port:

    const result = await scan('/path/to/file.zip', {
      host: '127.0.0.1',
      port: 3310,
    });

    API 签名完全不变,verdict 类型也保持一致——底层会自动切换到远程 clamd 协议。

    错误处理

    库的异常处理比较直接,抛出的错误信息基本能一眼看出问题所在:

    try {
      const result = await scan(path.resolve(filePath));
      return result;
    } catch (err) {
      // filePath 不是字符串      → 'filePath must be a string'
      // 文件不存在               → 'File not found: '
      // clamscan 不在 PATH 中    → ENOENT
      // 未知退出码               → 'Unexpected exit code: N'
      console.error('扫描异常:', err.message);
      return null;
    }

    特性

    • 零运行时依赖,仅仅使用 Node.js 内置的 child_process
    • 不解析 stdout,直接读取退出码,性能干净利落
    • 支持 TypeScript,verdict 为 Symbol 类型,不会因拼写错误导致 bug
    • 既支持本地 clamscan,也支持远程 clamd TCP socket
    • 跨平台:macOS、Linux、Windows 均可使用
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 文件上传
    相关文章 更多
    vue上传文件格式怎么设置及要求说明
    vue上传文件格式怎么设置及要求说明

    学习如何在Vue项目中设置文件上传格式限制。本文介绍使用HTML accept属性进行基础过滤,以及结合JavaScript进行严格后缀名校验的方法,确保只允许指定类型的文件被上传。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    前端文件上传接口怎么传使用FormData提交文件教程
    前端文件上传接口怎么传使用FormData提交文件教程

    详解如何使用原生 JavaScript 和 FormData 对象实现前端文件上传,涵盖单文件、多文件提交及进度监听,无需依赖重型库,提升代码可控性。

    xshell上传文件的方法教程及具体操作步骤
    xshell上传文件的方法教程及具体操作步骤

    遇到Xshell无法直接拖拽上传文件的困扰?本文详解如何通过安装lrzsz使用rz命令快速上传小文件,以及利用内置SFTP功能稳定传输大文件的具体操作步骤。

    PDF转TXT操作步骤与转换后内容核对指南
    PDF转TXT操作步骤与转换后内容核对指南

    本文详细介绍使用在线工具将PDF转换为TXT的操作流程,涵盖从文件上传、格式转换到结果下载的全过程。重点讲解转换后如何核对段落顺序、检查乱码与缺字,以及处理扫描版PDF的识别问题,确保导出文本准确无误。

    JSP实现文件上传功能
    JSP实现文件上传功能

    文件上传在Web开发中算是高频需求了,JSP配合Servlet实现时,有几个关键点很容易踩坑。下面就把完整流程拆开来讲,从依赖包到页面再到后台处理,一步步说清楚。 一、准备部分 需要两个JAR包:fileupload.jar 和 io.jar。构建好路径后就可以继续了。 二、页面部分 学号: 姓名:

    input的accept属性让文件上传安全高效
    input的accept属性让文件上传安全高效

    HTML的accept属性可在文件选择器中自动过滤不支持的文件类型,减少用户误选,从而降低前端校验代码量,提升上传体验。但该属性仅用于优化用户体验,不能替代后端安全验证,必须结合服务器端校验确保文件安全。

    如何修复Safari浏览器在执行大规模文件上传时中断的问题?
    如何修复Safari浏览器在执行大规模文件上传时中断的问题?

    Safari上传大文件中断源于WebKit内存映射与macOS内存压缩策略冲突。解决措施包括:改用原生表单提交绕过JS内存分配、禁用WebKitMemoryPressureRelief、启用传统上传通道及清理上传缓存,其中前两种方案效果显著。

    Safari浏览器如何解决网页中Input File文件上传框无法选择多个文件?
    Safari浏览器如何解决网页中Input File文件上传框无法选择多个文件?

    iOSSafari16.4及以上版本支持inputfile多选,旧版本需移除multiple属性并分批上传,或动态检测版本启用。隐藏input应改用clip方式,避免display:none。同时确保正确遍历files对象及FormData同名append。

    ThinkPHP 8.0 文件上传 OSS 整合教程【保姆级】
    ThinkPHP 8.0 文件上传 OSS 整合教程【保姆级】

    ThinkPHP8.0整合阿里云OSS上传采用配置驱动机制,通过安装SDK、设置环境变量、启用OSS磁盘实现统一调用。控制器上传需校验文件类型,用uniqid重命名并按日期分目录存储,防止路径穿越。可选直传签名用于大文件前端上传。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。