jquery 漏洞
2019年4月,漏洞一个叫“jQuery File Upload”的漏洞插件被爆出任意文件上传漏洞。攻击者构造一个multipart请求,漏洞就能把PHP脚本丢到服务器上执行。漏洞这个插件的漏洞下载量当时已经超过300万次。很多开发者根本不知道自己的漏洞项目里藏着这个组件——它是被某个后台模板捆绑进来的。
这就是漏洞jQuery漏洞的典型面貌:不是jQuery核心本身频繁出问题,而是漏洞围绕它的插件生态、旧版本残留、漏洞以及开发者对DOM操作的漏洞粗放使用,构成了一个长期被低估的漏洞攻击面。
核心库的漏洞漏洞:少,但影响面大
jQuery核心被曝出的漏洞高危漏洞不算多,但每一个都波及极广。漏洞最典型的漏洞是CVE-2020-11022和CVE-2020-11023,影响jQuery 1.0.3到3.4.1的所有版本。问题出在htmlPrefilter方法上——当你用.html()、.append()等方法传入用户可控的字符串时,jQuery会先经过一层正则处理,而这层处理可以被绕过,导致XSS。
攻击载荷长这样:<style><style /><img src=x onerror=alert(1)>。jQuery的正则以为自己在处理安全的HTML,实际上把恶意标签放行了。这个漏洞的CVSS评分是6.1,中危。但考虑到jQuery在2019年的市场占有率超过70%,实际风险远高于评分所示。
修复方式倒是简单:升级到3.5.0+。问题是,大量项目锁死在旧版本上。WordPress在5.5版本之前一直捆绑jQuery 1.12.4,Drupal 7更是长期停留在1.4.4。这些CMS驱动的网站占了互联网的很大比例,升级jQuery意味着要回归测试所有依赖它的前端交互,没人愿意干这活。
插件的漏洞:真正的重灾区
jQuery本身的设计哲学是“写得少,做得多”,这催生了海量插件。插件的质量参差不齐,安全问题层出不穷。
除了前面提到的File Upload,还有jQuery DataTables的XSS漏洞(CVE-2020-28458),jQuery Validation Engine的反射型XSS,jQuery Mobile的跨站脚本问题。这些插件的共同特点是:维护者往往已经停止更新,但用户还在用。
我见过一个政府网站,前端用了jQuery 1.7.2加上七八个早已不维护的插件。打开控制台,一堆废弃API的警告。问他们为什么不升级,回答是“能跑就行”。这种心态在国内的To G项目里非常普遍。
为什么jQuery的漏洞特别难缠
jQuery的DOM操作API天然容易引入XSS。.html()、.append()、.prepend()、.before()、.after()、.wrap()——这些方法如果传入未经过滤的用户输入,就是XSS直通车。很多开发者习惯了$('#div').html(userInput)这种写法,根本没意识到危险。
React和Vue默认会转义插值表达式,jQuery没有这层保护。它给了你最大的自由度,也给了你最大的犯错空间。
另一个问题是jQuery的版本碎片化。一个项目里可能同时存在多个jQuery版本——主题带一个,插件A依赖1.x,插件B依赖2.x。浏览器里加载了两份jQuery,全局变量$被反复覆盖。这种环境下,即使你想升级,也不知道该升哪个。
现在还需要关心jQuery漏洞吗
需要。W3Techs的数据显示,截至2024年,仍有超过75%的网站使用jQuery。很多是WordPress、Shopify主题自带的。你写的新项目可能没用jQuery,但你维护的老项目大概率还在用。
更隐蔽的是,jQuery漏洞经常和其他漏洞组合利用。比如先通过一个上传漏洞拿到低权限,再利用jQuery的XSS漏洞窃取管理员Cookie,完成提权。单独看每个漏洞都不致命,串起来就是一条完整的攻击链。
我的建议很直接:新项目别用jQuery了,原生querySelector和fetch足够用。老项目跑一次npm audit或者retire.js,看看依赖树里有没有带漏洞的jQuery版本。如果有,评估升级成本,该升就升。实在升不了,至少在服务端对输出做严格的HTML转义,别把安全责任全推给前端库。
jQuery不会消失,它的漏洞也不会。你能做的,是别让自己的项目成为下一个被扫描器扫出来的案例。