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

如何修复基于DOM的JS注入漏洞?escape方法致正常代码报错

正确解决XSS漏洞同时保留业务功能的方案

你的核心问题是用错了转义方式——你用的是HTML转义,这是用来防止内容注入到HTML中的,而不是用来处理要执行的JavaScript代码的,所以才会导致合法代码无法解析。下面是两种可行的解决方案,按安全性优先级排序:

方案一:彻底抛弃eval(推荐)

eval是XSS漏洞的根源,完全避免使用它是最安全的做法。结合你正常业务的参数格式,可以把参数改为纯JSON结构,用JSON.parse解析,它只会处理合法的JSON数据,不会执行任意代码。

具体步骤:

  1. 调整参数格式:把原来的val = ["foo", "bar"];改为只传["foo", "bar"](后端或生成参数的地方同步修改)
  2. 修改前端代码:
var v = getURLValue("resultOfInterest");
v = unescape(v);
try {
  // 解析JSON得到数组
  var val = JSON.parse(v);
  // 这里执行原来的业务逻辑,比如使用val数组
  console.log(val); // 输出 ["foo", "bar"]
} catch (error) {
  // 处理非法参数(比如被篡改的恶意内容)
  console.error("无效的参数格式:", error);
  // 可以在这里添加降级逻辑,比如使用默认值
}

方案二:无法修改参数格式时,做严格的格式校验

如果因为业务限制不能修改参数格式,只能保留eval,那必须对参数做严格的格式校验,只允许符合预期结构的内容通过,大幅缩小攻击面。

具体代码:

var v = getURLValue("resultOfInterest");
v = unescape(v);
// 正则匹配预期的格式:必须以val = [开头,];结尾,中间是双引号包裹的字符串元素
var validParamPattern = /^val = \[("[^"]+"(,\s*"[^"]+")*)\];$/;

if (validParamPattern.test(v)) {
  // 格式校验通过后再执行
  window.eval(v);
} else {
  // 参数不符合预期,拒绝执行
  console.error("参数格式非法,拒绝执行");
}

注意:这种方案仍存在极小风险(比如正则表达式的边界情况),所以优先推荐方案一。

为什么原来的转义方法无效?

你写的escapeOutput函数是把特殊字符转成HTML实体(比如"转成"),这是为了防止内容插入到HTML标签/属性时被注入恶意代码。但在JavaScript代码中,"不是合法的语法,所以eval会报错——这种转义方式完全不适用于要执行的JS代码场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:17:47