您现在的位置是:娱乐 >>正文

jquery跨站脚本漏洞修复

娱乐16255人已围观

简介2019年那次jQuery爆出的CVE-2019-11358,让一堆老项目连夜加班。问题出在$.extend()上,攻击者能通过它污染对象的原型链。你以为是传个普通参数,结果人家把__proto__塞 ...

2019年那次jQuery爆出的跨站CVE-2019-11358,让一堆老项目连夜加班。脚本问题出在$.extend()上,漏洞攻击者能通过它污染对象的修复原型链。你以为是跨站传个普通参数,结果人家把__proto__塞进去了,脚本整个应用的漏洞对象行为直接失控。这种漏洞不是修复弹个框吓唬你,而是跨站能篡改页面逻辑、偷用户数据、脚本甚至劫持会话。漏洞

修复思路其实不复杂,修复核心就一句话:别让不可信的跨站数据触碰$.extend()的深拷贝逻辑。但现实里,脚本很多项目直接引用的漏洞老版本jQuery,改动源码不现实,升级版本又怕兼容性炸了。我见过一个后台管理系统,所有表单验证都依赖jQuery 1.7的$.ajax和事件委托,升到3.x直接白屏,最后只能打补丁。

最直接的修法,升级到jQuery 3.4.0以上。官方在3.4.0里改了$.extend()的行为,不再拷贝__proto__属性。但如果你项目里用了大量插件,比如老版jQuery UI,升级后可能样式错乱、方法失效。这时候别硬扛,用第二种方案——自己封装一个安全的extend。写个函数,遍历对象时跳过__proto__、constructor、prototype这些危险键。说白了,就是手动过滤,简单粗暴但有效。

还有种情况,你压根没直接用$.extend(),但第三方库内部用了。比如某个轮播插件,把用户配置项和默认配置合并,用的就是jQuery的extend。这种隐蔽依赖最坑人。排查方法也简单,全局搜一下$.extend或者jQuery.extend,看哪些文件在调。如果数量不多,逐个改;如果泛滥了,那就直接拦截jQuery的原生方法——在加载jQuery之后,立刻覆盖$.extend,改成安全版本。

我处理过一个真实案例。一个金融后台的报表模块,用户能自定义图表颜色和标题,前端把配置存进localStorage,下次加载时用$.extend(true, { }, defaultConfig, userConfig)合并。攻击者伪造一条localStorage数据,里面带__proto__.isAdmin = true,结果用户权限判断直接被绕过,能看到别人的交易记录。当时修复就是加了个白名单校验,只允许合并预定义的几个字段,其他一律丢弃。别偷懒,别想着“用户不会这么干”,安全对抗里,攻击者永远比你想象的执着。

另外注意,别只盯着$.extend()。$.ajax()的dataType为jsonp时,如果服务器返回的响应被注入恶意代码,同样能执行XSS。虽然这不算jQuery本身的洞,但很多开发者习惯性信任返回数据,直接插入DOM。修复方法:所有从外部拿来的数据,先经过text()或者textContent赋值,别用html()。如果你非要拼接HTML,那就用$.parseHTML(),并且第二个参数传false,禁止脚本执行。

最后说个容易忽略的点。就算你把jQuery升到3.7,如果页面里还混着老插件,比如那个经典的jquery-migrate,它为了兼容老API,可能会重新引入一些不安全行为。所以升级完,测试别只点主流程,把边缘功能都过一遍。我见过有团队升级后忘删migrate,漏洞照样存在,白忙活。

修这个漏洞,本质是别让用户的输入直接变成代码。你写代码时多问一句:这个数据能信吗?不能信就过滤、转义、白名单。jQuery的洞只是冰山一角,现代前端框架的虚拟DOM、模板注入,原理都相通。别指望一劳永逸,每次依赖更新都瞄一眼变更日志,比出事再补救省心得多。

Tags:

相关文章

  • 反渗透阻垢剂配方及原料

    娱乐

    反渗透阻垢剂的配方设计,核心就一句话:在特定水质条件下,用最低的药剂浓度,把结垢风险摁在萌芽状态。别指望一个万能配方通吃所有水源,那是外行人的幻想。 真正的配方师手里攥着几类关键原料。最基础的是有机膦 ...

    【娱乐】

    阅读更多
  • 爬虫抓取携程酒店评论

    娱乐

    携程的酒店评论页,是我见过最“结实”的反爬虫堡垒之一。它不像某些小网站那样裸奔,而是层层设卡:字体加密、CSS偏移、滑块验证、IP频率限制,轮番上阵。我花了一个下午,用Python的requests库 ...

    【娱乐】

    阅读更多
  • 如何查看网站是否正规

    娱乐

    去年有个朋友想在某二手平台买台相机,对方发来一个链接,页面做得和平台官网一模一样,连logo都分毫不差。他差点输入银行卡密码,被我拦下。我让他看地址栏——那串网址根本不是官方域名。他愣住了,说从没注意 ...

    【娱乐】

    阅读更多


友情链接