You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:18:03