在Node.js文件上傳中集成ClamAV掃描的詳細步驟
文件上傳是常見的攻擊面。用戶上傳的文件可能包含惡意軟件、ZIP 炸彈或 偽造的 MIME 類型。大多數(shù) Node.js 項目只做擴展名檢查,這遠遠不夠。
pompelmi 是一個 Node.js 庫,在文件落盤之前完成掃描,返回類型化的 verdict symbol,不依賴任何第三方運行時。
工作原理
- 驗證參數(shù)是否為字符串,文件是否存在
- 通過 child_process 調用 clamscan,讀取退出碼
- 將退出碼映射為 Symbol
沒有 stdout 解析,沒有正則,沒有隱式狀態(tài)。
安裝
需要 Node.js 和 ClamAV。
npm install pompelmi
安裝 ClamAV:
# macOS brew install clamav && freshclam # Debian / Ubuntu sudo apt-get install -y clamav clamav-daemon && sudo freshclam # Windows choco install clamav -y
基本用法
const { scan, Verdict } = require('pompelmi');
const result = await scan('/path/to/file.zip');
switch (result) {
case Verdict.Clean:
// 文件安全,繼續(xù)處理
break;
case Verdict.Malicious:
throw new Error('檢測到惡意軟件,文件已拒絕');
case Verdict.ScanError:
// 掃描未完成,按不可信文件處理
console.warn('掃描失敗,拒絕文件');
break;
}
返回值:
| 結果 | ClamAV 退出碼 | 含義 |
|---|---|---|
Verdict.Clean | 0 | 未發(fā)現(xiàn)威脅 |
Verdict.Malicious | 1 | 匹配到已知病毒簽名 |
Verdict.ScanError | 2 | 掃描本身失敗,文件狀態(tài)未知 |
在 Express 中集成
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 — 繼續(xù)保存文件
return res.status(200).json({ verdict: 'clean' });
} catch (err) {
fs.unlinkSync(filePath);
return res.status(500).json({ error: err.message });
}
});
遠程掃描(Docker)
如果 ClamAV 運行在容器中,通過 TCP socket 連接:
const result = await scan('/path/to/file.zip', {
host: '127.0.0.1',
port: 3310,
});
API 保持不變,verdict 類型不變。
錯誤處理
try {
const result = await scan(path.resolve(filePath));
return result;
} catch (err) {
// filePath 不是字符串 → 'filePath must be a string'
// 文件不存在 → 'File not found: <path>'
// clamscan 不在 PATH 中 → ENOENT
// 未知退出碼 → 'Unexpected exit code: N'
console.error('掃描異常:', err.message);
return null;
}
特性
- 零運行時依賴,僅使用 Node.js 內置 child_process
- 不解析 stdout,直接讀取退出碼
- 支持 TypeScript,verdict 為 Symbol 類型,防止拼寫錯誤
- 支持本地 clamscan 和遠程 clamd TCP socket
- 跨平臺:macOS、Linux、Windows
以上就是在Node.js文件上傳中集成ClamAV掃描的詳細步驟的詳細內容,更多關于Node.js文件上傳中集成ClamAV掃描的資料請關注腳本之家其它相關文章!
相關文章
node實現(xiàn)shell命令管理工具及commander.js學習
這篇文章主要為大家介紹了node實現(xiàn)shell命令管理工具及commander.js學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
如何使用axios庫在Node.js中進行代理請求(實踐案例)
axios是一個強大的基于Promise的HTTP客戶端,它在瀏覽器和Node.js環(huán)境中均可使用,本文將介紹如何充分利用axios庫,在Node.js中進行代理請求的最佳實踐,并通過一個實際案例來展示其應用,感興趣的朋友一起看看吧2024-03-03
nodejs連接mysql數(shù)據(jù)庫及基本知識點詳解
這篇文章主要介紹了nodejs連接mysql數(shù)據(jù)庫,結合實例形式總結分析了nodejs連接與操作mysql數(shù)據(jù)庫的相關模板、配置及mysql數(shù)據(jù)庫查詢、添加數(shù)據(jù)等操作技巧,需要的朋友可以參考下2018-03-03
Node.js腳本提取OPML文件信息實現(xiàn)示例詳解
這篇文章主要為大家介紹了Node.js腳本提取OPML文件信息,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09

