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

为何Checkmarx将文件下载响应代码标记为XSS漏洞?

Checkmarx标记XSS漏洞的原因及解决办法

我的函数被Checkmarx标记存在Cross-Site Scripting (XSS)攻击漏洞,检测结果如下:
应用在src\containers\FileUpload\index.js的第219行通过appendChild异步将不可信数据嵌入生成的输出中。该数据未经过适当的清理或编码直接嵌入,攻击者可借此注入恶意代码。
攻击者只需在用户输入数据中提供篡改内容,即可篡改返回的网页。这些输入在src\containers\FileUpload\index.js的第212行被异步方法读取,未经清理直接流向输出网页。

对应的业务代码:

downloadLink = async (event, url) => {
  event.preventDefault(); 
  let x = url.split("/v1/download-template/");
  let filename = x[1].toUpperCase();
   const response = await axios({
    url: url,
    method: 'GET',
    responseType: 'blob',
  });
  
  // line 212
  const { data } = response;
  if (data != null && (typeof data === 'object' || data instanceof Blob)) {
    console.log(response)
    const urlBlob = window.URL.createObjectURL(data);
    const link = document.createElement('a');
    link.href = urlBlob;
    link.setAttribute('download', `${filename}.csv`);
    // line 219
    document.body.appendChild(link);
    link.Click();
  }
}

我尝试过用第三方库对对象做sanitize处理,但问题仍未解决,求解答。


漏洞检测的逻辑分析

Checkmarx的判断核心在于两点:

  1. 不可信输入来源:filename是从传入的url参数中拆分出来的,工具默认认为url属于用户可控的不可信数据;
  2. DOM插入风险:你将带有这个不可信参数的a标签直接插入到DOM中,工具会判定这种“用户数据绑定DOM属性+插入DOM”的操作存在潜在XSS风险——即便download属性本身不会触发脚本执行,但静态扫描会基于规则判定风险,而非实际运行场景。

另外你用第三方库处理response.data是没用的,因为漏洞检测的指向根本不是Blob数据,而是来自URL的filename参数。

具体修复方案

1. 严格清理filename参数

对从URL中提取的filename做字符过滤,只保留合法的文件名字符(字母、数字、下划线、短横线),彻底消除不可信内容:

let filename = x[1].toUpperCase().replace(/[^A-Z0-9_\-]/g, '');

2. 优化DOM操作逻辑

当前代码在点击链接后没有移除临时创建的a标签,既浪费内存,也会让扫描工具觉得DOM操作不严谨。可以在触发下载后立即清理:

link.click(); // 注意:原生API是小写click,你代码里的大写Click会报错
document.body.removeChild(link);
window.URL.revokeObjectURL(urlBlob); // 释放Blob URL,避免内存泄漏

3. 误报处理(如果业务场景可信)

如果这个url参数仅由前端内部生成,不会被用户篡改(比如从可信接口获取、前端路由生成),可以直接在Checkmarx中将该问题标记为误报,并补充业务逻辑的安全性说明。


内容的提问来源于stack exchange,提问作者Bhau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:30:53