XSS 攻击与防御详解
XSS(Cross Site Scripting,跨站脚本攻击)是 Web 应用中常见的安全漏洞,其核心是攻击者在网页中注入恶意脚本,当用户访问该页面时,脚本在用户浏览器中执行,从而窃取信息、篡改页面或执行其他恶意操作。以下从攻击原理、类型、防御措施等方面进行详细说明。
XSS 攻击的本质
XSS 攻击的根本原因是Web 应用未对用户输入进行严格过滤,导致攻击者输入的恶意脚本被浏览器当作合法代码执行。
例如:用户在输入框中提交<script>alert('窃取cookie')</script>,若应用直接将该内容嵌入页面并返回,浏览器会执行其中的script代码,造成攻击。
XSS 攻击的三大类型
1. 反射型 XSS(非持久型 XSS)
- 特点:恶意脚本通过 URL 参数等方式传入,Web 应用直接 “反射” 给浏览器,不存储在服务器,需诱使用户主动点击恶意链接才能触发。
- 攻击流程:
- 攻击者构造含恶意脚本的 URL(如
http://example.com/search?key=<script>恶意代码</script>); - 诱导用户点击该 URL;
- 服务器将 URL 中的恶意脚本作为响应内容返回给用户浏览器;
- 浏览器执行恶意脚本,完成攻击(如盗取 cookie)。
- 攻击者构造含恶意脚本的 URL(如
- 场景:搜索框、URL 参数展示页面等。
2. 存储型 XSS(持久型 XSS)
特点:恶意脚本被永久存储在服务器(如数据库、评论区、日志等),所有访问包含该脚本页面的用户都会受到攻击,危害范围更广。
攻击流程:
- 攻击者在论坛、评论区等提交含恶意脚本的内容(如
<script>盗取用户信息</script>); - 内容被服务器存储;
- 其他用户访问该页面时,服务器从数据库读取恶意内容并返回;
- 浏览器执行脚本,攻击所有访问者。
- 攻击者在论坛、评论区等提交含恶意脚本的内容(如
场景:社交平台评论、博客文章、用户个人资料等。
3. DOM 型 XSS
- 特点:恶意脚本通过修改页面的DOM 结构触发,全程在客户端完成,不经过服务器,属于反射型 XSS 的特殊子集。
- 攻击流程:
- 攻击者构造含恶意脚本的 URL(如
http://example.com/#<script>恶意代码</script>); - 用户点击后,页面 JavaScript 读取 URL 中的恶意内容(如通过
location.hash); - 脚本将恶意内容直接插入 DOM(如
document.write),导致浏览器执行。
- 攻击者构造含恶意脚本的 URL(如
- 关键区别:反射型和存储型 XSS 的恶意脚本由服务器返回,而 DOM 型 XSS 的恶意脚本由客户端 JavaScript 直接处理并插入 DOM。
XSS 攻击的危害
- 窃取用户 Cookie、SessionID,冒充用户身份登录;
- 篡改页面内容(如显示虚假信息、钓鱼链接);
- 劫持用户浏览器,执行恶意操作(如自动转账、发送邮件);
- 利用用户权限发起进一步攻击(如攻击内网、提权)。
XSS 防御措施
防御核心原则:让用户输入的内容 “不可执行”,即严格过滤或转义用户输入的特殊字符。
1. 输入过滤与输出转义
输入过滤:在服务器端对用户输入的内容进行校验,拒绝包含
<script>、onclick等危险标签或事件的内容(可通过白名单限制允许的字符 / 标签)。输出转义:将用户输入的内容作为文本展示时,对 HTML 特殊字符进行转义,例如:
| 原字符 | 转义后 | 作用 |
| ——— | ——— | ————————— |
|<|<| 防止标签闭合 |
|>|>| 防止标签开启 |
|"|"| 防止属性值闭合 |
|'|'| 防止单引号闭合 |
|&|&| 防止转义字符被解析 |示例:用户输入
<script>alert('xss')</script>,转义后变为<script>alert('xss')</script>,浏览器会将其作为文本显示,而非执行脚本。
2. 限制 Cookie 权限
- 设置 Cookie 的
HttpOnly属性:禁止 JavaScript 通过document.cookie访问该 Cookie,可防止 XSS 窃取 Cookie。
示例:Set-Cookie: sessionId=xxx; HttpOnly - 设置
Secure属性:仅允许 HTTPS 协议传输 Cookie,避免明文泄露。 - 设置
SameSite属性:限制 Cookie 仅在同站点请求中发送,防止跨站请求伪造(CSRF)与 XSS 结合攻击。
3. 使用安全的 API
避免使用直接将字符串插入 DOM 的危险 API,如document.write()、innerHTML等,优先使用textContent(仅渲染文本,不解析 HTML)。
1
2
3
4// 危险:可能执行脚本
document.getElementById("content").innerHTML = userInput;
// 安全:仅显示文本
document.getElementById("content").textContent = userInput;
4. 启用内容安全策略(CSP)
CSP(Content Security Policy)是一种 HTTP 响应头,用于限制页面可加载的资源(脚本、样式、图片等)来源,禁止执行未授权的脚本。
示例:Content-Security-Policy: default-src 'self'; script-src 'self'
default-src 'self':仅允许加载本站资源;script-src 'self':仅允许执行本站的脚本,禁止执行内联脚本(<script>标签)或外部恶意脚本。
5. 其他辅助措施
- 定期更新 Web 框架和组件,修复已知的 XSS 漏洞;
- 对敏感操作(如转账、修改密码)增加二次验证(如验证码、短信验证);
- 使用 XSS 检测工具(如 OWASP ZAP)定期扫描应用,发现潜在漏洞
v1.3.10