Node.js中readFileSync输入如何消毒 解决Checkmarx存储型XSS报错
核心错误点
- 消毒逻辑执行顺序完全错误:
fs.readFileSync返回的是文件原始字符串/Buffer,你直接传入仅接收对象类型的sanitizeObject,此时没有任何消毒逻辑被触发,后续执行JSON.parse拿到的是完全未处理的不可信数据,工具自然会报未消毒风险。 - 现有
sanitizeObject仅支持一层平面对象消毒,若JSON存在嵌套结构、数组类型,深层值完全未被处理,存在安全漏判。
修复方案
1. 修正执行顺序,升级递归消毒逻辑
修改后的代码如下:
const fs = require('fs') const config = require('config') const { JSDOM } = require('jsdom'); const createDOMPurify = require('dompurify'); // 原代码缺失该行引入 const window = new JSDOM('').window; const DOMPurify = createDOMPurify(window); function sanitizeValue(value){ // 仅对字符串类型做HTML消毒,其他类型直接返回避免格式损坏 if (typeof value === 'string') { return DOMPurify.sanitize(value); } return value; } function sanitizeObject(obj) { // 边界值处理 if (obj === null || typeof obj !== 'object') { return sanitizeValue(obj); } // 数组类型处理 if (Array.isArray(obj)) { return obj.map(item => sanitizeObject(item)); } // 嵌套对象处理 const sanitizedObject = {}; Object.keys(obj).forEach(key => { sanitizedObject[key] = sanitizeObject(obj[key]); }); return sanitizedObject; }; const getMyData = () => { // 执行顺序:读文件 -> 转JSON对象 -> 消毒,顺序不可调换 const rawFileContent = fs.readFileSync('./my/dist/path/mydata.json', 'utf8'); const rawData = JSON.parse(rawFileContent); const sanitizedData = sanitizeObject(rawData); return sanitizedData; }
2. 补充上下文编码(按需适配)
如果后续数据是插入到HTML属性、JS代码片段等特殊位置,仅靠DOMPurify的HTML消毒不够,需要对应使用encodeURIComponent、HTML实体编码等方式做上下文适配处理,进一步降低XSS风险。
3. 工具误报处理
如果修复后Checkmarx仍误报,可在代码中添加工具认可的消毒标记注释,或在工具规则后台提报误判,关联你的消毒实现逻辑即可。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

