jQuery中.text()引发客户端潜在XSS漏洞的修复方法咨询
漏洞原因说明
.text()本身不存在安全问题,它只会返回目标元素内的纯文本内容,不会解析HTML。真正的风险点是你把取到的未做任何转义的文本,直接拼接到了jQuery选择器字符串中。
jQuery选择器有自己的语法解析规则,如果拼接进去的内容包含]、"、'、空格、括号这类特殊符号,会直接打破选择器的语法结构。如果#plazoActual的文本内容是用户可控的(比如来自用户提交内容、URL参数、未校验的第三方返回值),攻击者可以构造特殊字符串闭合选择器语法,在低版本jQuery中甚至会触发DOM解析逻辑执行任意脚本,形成XSS漏洞。
举个直观的例子,如果#plazoActual的文本被篡改为:
1]').remove();$('body').append('<img src=x onerror=alert(document.cookie)>');//
最终拼接出来的选择器字符串会变成可执行的恶意代码,直接触发脚本执行。
安全修复方案
优先推荐用DOM原生属性匹配的方式写逻辑,从根源上避免选择器注入问题,不需要额外转义,兼容性最好:
const plazoVal = $('#plazoActual').text().trim(); $('#plazo input').filter(function() { return this.value === plazoVal; }).prop('checked', true);
这种写法是遍历#plazo下的所有input,直接拿元素的value属性和目标值做严格相等判断,完全不经过选择器语法解析,不管目标值里包含什么特殊字符都不会出现语法逃逸,彻底堵死注入路径。
如果你习惯用属性选择器写法,在jQuery 3.0及以上版本中,可以使用官方提供的$.escapeSelector()方法转义拼接内容里的选择器特殊字符,注意属性值必须用双引号包裹:
const plazoVal = $.escapeSelector($('#plazoActual').text().trim()); $('#plazo input[value="' + plazoVal + '"]').prop('checked', true);
内容的提问来源于stack exchange,提问作者Francisco Figueroa
相关产品推荐
相关产品推荐

