一个叫“评论”的站攻输入框,某天深夜突然弹出一段红色警告。站攻那不是站攻系统报错,是站攻黑客留下的痕迹。XSS——跨站脚本攻击,站攻说白了就是站攻往别人的网页里塞你自己的代码。这玩意儿不新鲜,站攻1999年就被发现了,站攻可到今天,站攻全球排名前十万的站攻网站里,仍有超过四成存在XSS漏洞。站攻
攻击者要做的站攻,只是站攻找个不设防的输入框。你在论坛发帖,站攻在搜索栏打字,站攻在个人资料里填“爱好”,后端要是没做好过滤,你的输入就被当成代码执行了。最常见的是反射型,像弹弓一样,恶意脚本藏在URL里,你点开链接,脚本就跟着请求反射回来,在你浏览器里跑一遍。存储型更狠,脚本直接存进服务器数据库,谁打开那个页面谁中招,像慢性毒药。还有基于DOM的,纯靠前端JavaScript操作DOM时留下的破绽,连服务器都察觉不到。
我见过一个真实案例。某电商平台,买家昵称里嵌了段JavaScript,管理员后台一加载订单列表,脚本就偷走管理员的会话Cookie。整个过程悄无声息,像小偷用钥匙打开门,不碰任何东西,只复印了证件。攻击者拿到管理员权限后,改商品价格,导出用户手机号和地址,转手卖给了黑产。从头到尾,网站代码没改一行,漏洞就出在昵称那栏没转义尖括号。
别以为现在的框架能挡一切。React默认转义大部分内容,可你要是用了dangerouslySetInnerHTML,等于亲手把门锁卸了。Vue的v-html同理。开发者图省事,把用户提交的内容直接当HTML渲染,还美其名曰“富文本支持”。富文本编辑器本身就成了重灾区——允许用户传任意HTML,就等于允许用户传任意脚本。
防御手段说穿了也不复杂。核心一条:永远不要信任用户输入。输入要校验,输出要编码。把<script>变成<script>,让浏览器把它当纯文本显示,而不是执行。用CSP(内容安全策略)锁死脚本来源,就算代码被注入,也没法从外部加载恶意文件。HttpOnly标记Cookie,让JavaScript摸不到你的登录凭证。这些招数都是基础功,可很多团队连基础功都懒得做。
有个细节很多人忽略:XSS不只是技术问题,更是信任问题。你信任第三方评论插件,信任统计代码,信任CDN上的脚本库——任何一个环节被攻破,都等于你的页面被人插了后门。前几年某流行前端库被黑客篡改,通过npm分发恶意版本,全球几万个网站中招。那根本不是开发者写错代码,是供应链里混进了内鬼。
说到底,XSS攻击玩的是“身份混淆”。浏览器分不清哪段代码是网站自己的,哪段是用户塞进来的。只要这个边界模糊,攻击就永远有缝可钻。而防守的本质,就是把这个边界划得清清楚楚,明明白白。