一个下午,漏洞我盯着Burp Suite里那个红色的漏洞报错,差点把咖啡泼到键盘上。漏洞目标站点的漏洞搜索框把用户输入直接拼进了SQL查询,单引号一进去,漏洞整个数据库就像被撬开的漏洞保险箱。这不是漏洞什么高深攻击,就是漏洞个最基础的注入点,但对方是漏洞家银行。你能想象吗?漏洞银行的核心查询接口,连参数化查询都没做。漏洞
JavaScript的漏洞漏洞往往就是这么讽刺。开发者以为自己在写前端逻辑,漏洞实际上在给攻击者递刀。漏洞XSS算是漏洞最常见的——你往评论区塞一段<script>,别人的浏览器就替你执行了。去年有个电商平台,因为产品描述字段没过滤,被植入挖矿脚本,用户访问商品页时CPU直接飙到100%。最狠的是,那脚本还聪明地检测到DevTools打开就暂停,普通用户根本发现不了。
DOM Clobbering更阴险。它不碰服务器,纯粹利用HTML标签的id和name属性覆盖JavaScript变量。比如页面里有个<div id="config">,你脚本里写的window.config就不再是原来的对象,而是这个DOM节点。攻击者只要注入一个同名标签,就能让整个前端逻辑崩掉。我见过有团队花两周排查一个诡异的权限绕过,最后发现是登录页被塞了个隐藏的<form name="user">,把全局变量覆盖成了空值。
原型链污染是进阶玩家的玩具。它利用Object.prototype的继承特性,通过修改__proto__给所有对象统一加属性。有个开源编辑器就栽在这上面——攻击者上传一个精心构造的JSON文件,里面藏了{ "__proto__": { "isAdmin": true}},结果所有用户的权限判断都被污染了。修复起来也麻烦,得逐个检查对象的赋值操作,因为问题可能藏在任何一行Object.assign或展开运算符里。
别以为用了框架就安全。React的dangerouslySetInnerHTML、Vue的v-html,都是官方留的后门。有人统计过,前端框架的XSS漏洞里,超过六成是开发者主动调用这些高危API造成的。框架拦得住常规攻击,拦不住你自己的手。
最让我头皮发麻的是供应链攻击。npm包三天两头出问题,你装了个依赖,它可能在某个版本里偷偷加了段读取cookie的代码。去年那个ua-parser-js事件还记得吗?维护者的账号被盗,恶意代码直接推送给了数百万个项目。你连自己写的代码都未必完全清楚,更别说几百个传递依赖了。
说真的,js漏洞就像房间里的大象。人人都知道它存在,但大多数团队只会用安全扫描工具跑一遍,看到绿灯就以为万事大吉。可真正的漏洞往往藏在业务逻辑里——比如你重置密码的接口,是否校验了token归属?你导出报表的功能,有没有过滤掉纵向越权?工具查不出这些。
前阵子帮朋友审计一个后台系统,翻到导出功能时发现,前端把用户ID放在localStorage里,后端直接信任这个值。我改一下本地存储,就能导出别人的数据。修复方案也简单,后端校验session就行。但就是这种基础问题,在线上跑了一年多没人发现。
写代码的时候多问自己一句:如果这个输入被恶意构造会怎样?如果你把信任边界画清楚,把用户输入当敌人看待,至少一半的漏洞能堵住。剩下的,就靠运气和持续监控了。前端安全不是锦上添花,是雪中送炭——只不过这炭,往往在起火那天才想起来要买。