版本信息
- 操作系统版本:win11
- nodejs:v14.16.0
场景:
- 接收了base64格式数据字符串(
data:*/*;base64,xxxxxx
就是这种样式的);要将其存储于本地。 - 将字符串
,
号后的字符串转二进制写入本地。内容各种的都获取成功,也创建写入成功。 - 问题出来了:后缀的获取出了错,以至于生成了一个
filename.
样式的文件; - 在win系统,当要删除的时候会提示找不到文件;想改后缀名同样也提示找不到文件;可几十兆的文件就在那里。
- 尝试了用360杀毒里的文件粉碎工具进行删除……界面提示成功了,但是文件依然存在
生成文件代码:
const targetDirectoryPath = '文件存储的目录';//const ext = ;//错误的根源在这里;当时获取后缀的脚本写错 导致此值应该是 undefined 或 null// arg.data 的base64图片数据const base64Data = arg.data.split(',')[1];const bufferData = Buffer.from(base64Data, 'base64');const hashHex = '省略';//获取二进制哈希作为文件名(文件名是有的)// 错误的原因是 ext 文件后缀没有获取到,但是内容成功创建const targetFilePath = `${targetDirectoryPath}/${hashHex}.${ext}`;// 将文件内容写入fs.writeFile(targetFilePath, bufferData, (writeErr) => {if (writeErr) throw writeErr;// console.log(`File has been moved and renamed to ${targetFilePath}`);});
猜想
nodjs理解的是:这是一个有内容的文件。
win理解的是:这是一个神奇的目录?还有二进制数据!还是来自外星的文件后缀?
解决办法
谁干的坏事让谁来解决,
写nodejs脚本来删除:
const fs = require('fs');
// const path = require('path');
const delFile = (filePath) => {try{// let files = [];if (fs.existsSync(filePath)){// filePath 已是文件路径 请直接删除fs.unlinkSync(filePath);}else{console.log('文件不存在!');}}catch (err){console.log(err);}
};
let x;
console.log('x:'.x);//undefined
let fileName = "fileName."+x;//尝试1:删除失败
let fileName = "fileName.";//尝试2:删除成功
delFile('E:\\a\\b\\'+fileName);
console.log('删除文件完成!');
对于不懂脚本的人来说
如果恶意生成一堆这类几十兆的文件,存在于win系统中这可能是致命的缺陷。
我没有去尝试复现,感兴趣的朋友可以去复现,弄清楚原因;如果确实是漏洞,可以向win和node提交;