Node.js/Express删除文件遇fs包安全问题的解决方法
Node.js/Express 项目安全实现文件删除的方案
首先先澄清最容易踩的误区:你看到npm提示有安全风险的fs,是npm源上托管的第三方同名废弃包,不是Node.js官方内置的fs核心模块。那个第三方fs包已经停止维护多年,确实存在已知漏洞,但Node.js运行时自带的内置fs模块由官方长期维护,没有对应安全风险,是最可靠的文件操作选择。
如果你之前在项目里执行过npm install fs把第三方fs包装进了依赖,直接执行npm uninstall fs删掉即可,代码里引用fs时可以加node:前缀明确指定使用内置模块,比如const fs = require('node:fs/promises'),就不会触发相关安全告警。
具体安全实现方式
- 优先使用内置fs模块实现删除
Node.js 14.14.0及以上版本推荐使用Promise风格的内置fs API,删除文件可以用fs.rm方法,比旧版的unlink兼容性更好,支持配置强制删除、递归删除等参数。注意所有文件操作前必须做路径校验,防范路径遍历攻击,这才是文件删除功能最高发的安全风险点,参考实现:const fs = require('node:fs/promises'); const path = require('node:path'); // 定义允许删除的文件根目录,比如上传文件存储目录 const ALLOWED_DELETE_ROOT = path.resolve(__dirname, '../public/uploads'); async function safeDeleteFile(inputPath) { // 把传入路径解析为绝对路径 const targetPath = path.resolve(inputPath); // 校验目标路径是否在允许操作的根目录下,拦截../../类的路径遍历请求 if (!targetPath.startsWith(ALLOWED_DELETE_ROOT)) { throw new Error('无权限操作目标路径文件'); } try { // force: true 表示文件不存在时不抛出异常,适配重复删除场景 await fs.rm(targetPath, { force: true }); return true; } catch (err) { console.error('文件删除失败:', err); return false; } } - 如需更便捷的封装,可选择经过社区广泛审计的成熟第三方包
如果需要递归删除目录、更友好的错误封装等能力,可以选择fs-extra这类周下载量超千万、长期维护的工具库,它的所有文件操作能力底层都是基于Node.js内置fs实现,没有额外的不安全依赖,删除文件调用remove方法即可,使用前同样不能省略路径校验步骤,示例:const fse = require('fs-extra'); // 路径校验逻辑和上述内置实现完全一致,校验通过后再执行删除 await fse.remove(validatedTargetPath);
关键安全提醒
不要使用来源不明、维护停滞、下载量极低的第三方文件操作类包,这类包才是npm安全提示的主要风险对象。文件删除功能的安全性和你选什么包没有必然关系,只要做好路径白名单校验、严格限制可删除的文件范围,使用官方内置模块就是性能最好、安全系数最高的方案,不需要盲目引入额外依赖。
内容的提问来源于stack exchange,提问作者eylesa
相关产品推荐
相关产品推荐

