XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击,攻击者往 Web 页面插入恶意 Script 代码,当用户浏览该页面时,嵌入的恶意代码会被执行。
解决的核心痛点:如何在允许用户输入的同时,防止恶意脚本执行?
核心命题
- XSS的本质是浏览器无法区分用户数据和开发者代码
- 原理:浏览器盲目信任并执行所有脚本,不管数据来自哪里
- 输出转义是防御XSS的核心方法
- 原理:将特殊字符转换为 HTML 实体,使脚本不会被执行
- 现代框架默认防御XSS,但危险API仍需注意
- 原理:React dangerouslySetInnerHTML、Vue v-html 等会绕过转义
三种类型
| 类型 | 存储位置 | 触发方式 | 危害 |
|---|---|---|---|
| 存储型 | 数据库 | 用户访问页面时自动执行 | 最高(持久化) |
| 反射型 | URL 参数 | 用户点击恶意链接 | 中等 |
| DOM 型 | 前端 JS | JS 操作 DOM | 中等(纯前端) |
防御方法
| 方法 | 说明 |
|---|---|
| 输出转义 | 将特殊字符转换为 HTML 实体 |
| CSP | 限制脚本执行来源 |
| DOMPurify | 富文本清洗库 |
| HttpOnly | 防止 Cookie 被窃取(不能防御 XSS 本身) |