2019年3月,框架一个叫Ammar Askari的漏洞安全研究员在Twitter上发了一段视频。他只用了三行代码,框架就在某个主流前端框架的漏洞开发者工具里拿到了用户的cookie。那个框架当时被全球超过60%的框架网站使用。这不是漏洞电影情节。
前端框架的框架漏洞和传统Web漏洞有个本质区别:它们往往藏在抽象层里。你写的漏洞是v-html或者dangerouslySetInnerHTML,框架帮你把字符串变成DOM。框架问题就出在这个"帮你"上——它帮你的漏洞时候,也帮了攻击者。框架
React的漏洞dangerouslySetInnerHTML名字起得够直白了吧?可GitHub上搜一下,每天都有新项目在用它渲染用户评论。框架开发者觉得"我做了转义",漏洞但转义规则和浏览器解析规则之间的框架灰色地带比大多数人想象的宽。比如<img src=x onerror=alert(1)>,你转义了尖括号,浏览器照样执行。React的JSX在编译时会处理一部分,但动态拼接的字符串它管不了。
Vue这边有个更微妙的坑。模板编译时,v-bind绑定的属性值如果包含"和>,在某些版本里能直接闭合标签。CVE-2020-7608就是这类问题。官方修复了,但大量老项目锁着旧版本。npm audit报出来也没人理——"能跑就行"。
Angular的漏洞历史更有意思。它的模板引擎太强大了,强大到能执行表达式。早期版本里,{ { constructor.constructor('alert(1)')()}}这种payload直接能打穿沙箱。后来他们搞了严格上下文转义,结果2021年又出了个CVE-2021-4231,通过ng-template的注入绕过。框架越复杂,攻击面越大,这个规律在哪儿都成立。
真正让我在意的是供应链层面。你用的UI库、路由库、状态管理库,它们都依赖核心框架。核心框架修了漏洞,下游库不更新,你的应用照样裸奔。2022年那个node-ipc投毒事件,虽然不算框架本身的漏洞,但手法如出一辙——攻击者盯着生态链上最薄弱的环节。
我见过一个真实案例。某电商网站用Vue 2.6.11,模板里有个:style绑定用户输入的颜色值。攻击者提交red;background:url(javascript:alert(document.cookie)),在某些浏览器里直接执行。这个漏洞不在Vue核心,在开发者对"数据绑定"的盲目信任。框架把数据从A搬到B,不代表它检查了数据本身。
怎么防?别指望框架帮你兜底。用户输入进DOM之前,自己过一遍DOMPurify。模板里永远别用v-html或dangerouslySetInnerHTML处理不可信内容——如果非要用,先想想有没有替代方案。CSP头加上,script-src 'self'能挡掉大部分XSS。框架版本别锁死在^范围,npm的语义化版本在安全更新上经常不靠谱。
还有个反直觉的点:越流行的框架,漏洞发现得越快,修复也越快。React和Vue的核心团队响应速度以小时计。真正危险的是那些小众框架,或者已经停止维护的版本。你图省事用了某个"轻量级"方案,出了漏洞连个CVE编号都搜不到。
最后说个数据。Snyk 2023年的报告显示,前端项目平均引入47个直接依赖,间接依赖超过600个。你审计得过来吗?我审计不过来。所以我的做法是:核心框架跟最新稳定版,UI库选维护活跃的,剩下的——能少用就少用。每多一个依赖,就多一个别人替你写漏洞的机会。