如何修复基于DOM的JS注入漏洞?escape方法致正常代码报错
正确解决XSS漏洞同时保留业务功能的方案
你的核心问题是用错了转义方式——你用的是HTML转义,这是用来防止内容注入到HTML中的,而不是用来处理要执行的JavaScript代码的,所以才会导致合法代码无法解析。下面是两种可行的解决方案,按安全性优先级排序:
方案一:彻底抛弃eval(推荐)
eval是XSS漏洞的根源,完全避免使用它是最安全的做法。结合你正常业务的参数格式,可以把参数改为纯JSON结构,用JSON.parse解析,它只会处理合法的JSON数据,不会执行任意代码。
具体步骤:
- 调整参数格式:把原来的
val = ["foo", "bar"];改为只传["foo", "bar"](后端或生成参数的地方同步修改) - 修改前端代码:
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
相关产品推荐
相关产品推荐

