一、XSS攻击的本质
跨站脚本攻击(XSS)是Web安全领域最普遍的漏洞之一,攻击者通过注入恶意脚本代码到网页中,当其他用户浏览该页面时,恶意脚本将在用户浏览器执行,实现:
- 会话劫持(窃取Cookie)
- 网络钓鱼伪造
- 键盘记录
- 非法重定向等攻击
二、XSS攻击三大类型详解
| 类型 | 攻击流程 | 危害等级 | 典型案例 |
|---|---|---|---|
| 反射型XSS | 恶意脚本通过URL参数注入→服务器直接返回含脚本的页面→用户执行脚本 | ★★☆☆☆ | https://victim.com?search=<script>恶意代码</script> |
| 存储型XSS | 恶意脚本提交到数据库→其他用户访问时从服务端加载→批量用户执行脚本 | ★★★★★ | 评论区注入脚本影响所有访问者 |
| DOM型XSS | 前端JS直接操作URL参数/客户端数据→动态生成DOM时注入可执行代码 | ★★★★☆ | location.hash被innerHTML解析执行 |
三、XSS漏洞扫描工具
- 自动化扫描工具
- Acunetix WVS(商业级)
- OWASP Zap(开源)
- W3af(Kali内置)
- 渗透测试平台
Kali Linux(集成Burp Suite、Vega等) - 手动测试工具
Burp Suite(Repeater/Scanner模块)
四、XSS防御策略体系
(一)基础防护原则
graph TD
A[用户输入] --> B{输入过滤}
B --> C[白名单校验]
B --> D[移除危险字符]
C --> E[输出转义]
D --> E
E --> F[HTML/JS/URL上下文编码]
(二)关键防御手段
-
内容安全策略(CSP)
<!-- HTTP Header设置 --> Content-Security-Policy: script-src 'self'; style-src 'unsafe-inline' <!-- Meta标签设置 --> <meta http-equiv="Content-Security-Policy" content="default-src 'self'">- 核心指令:
script-src/style-src/img-src - 禁止内联脚本:
'unsafe-inline' - 禁止eval:
'unsafe-eval'
- 核心指令:
-
安全DOM操作
// 危险操作 ❌ element.innerHTML = userInput; // 安全操作 ✅ element.textContent = userInput; document.createElement('div'); -
XSS过滤库
npm install dompurify # 推荐DOMPurifyimport DOMPurify from 'dompurify'; const cleanHTML = DOMPurify.sanitize(dirtyHTML); -
会话安全加固
Set-Cookie: sessionID=xxx; HttpOnly; Secure; SameSite=Strict
五、深度剖析:跨页面参数传递的安全陷阱
▶ 场景描述
用户正在A页面填写含手机号的表单,开发者试图通过URL参数将手机号传递给B页面自动填充:
https://b.com?phone=13800138000
▶ 安全问题分析
-
DOM型XSS攻击入口
// 不安全的B页面实现 const phone = new URLSearchParams(location.search).get('phone'); document.getElementById('phone').value = phone;当攻击者构造恶意URL:
https://b.com?phone="><script>stealCookies()</script>
若B页面使用innerHTML或未过滤引号,则注入成功。 -
数据篡改风险
即使使用textContent,攻击者仍可伪造参数值:
https://b.com?phone=攻击者号码→ 诱导用户提交错误数据
▶ 问题归类
此场景属于 DOM型XSS攻击,根源在于:
- URL参数作为非受信数据源被直接使用
- 敏感数据暴露在客户端可修改区域
▶ 安全解决方案
| 方案 | 实现方式 | 安全等级 |
|---|---|---|
| 服务端会话存储 | A页提交数据→服务端存session→B页从session加载 | ★★★★★ |
| 加密参数传递 | AES加密URL参数:https://b.com?data=ENCRYPTED_DATA→B页解密校验 | ★★★★☆ |
| PostMessage通信 | window.postMessage({phone: '138xxx'}, 'https://b.com', [targetOrigin]) | ★★★☆☆ |
| Input值二次确认 | B页填充时显示“已预填手机号,请确认”并强制用户手动验证 | ★★★☆☆ |
✨ 最佳实践建议:
禁止通过URL明文传输敏感数据! 对于手机号、身份证号等PII数据,必须使用服务端会话存储或加密传输。
六、总结思考
XSS防御本质是建立对非受信数据的零信任体系:
- 所有用户输入、URL参数、第三方数据均视为潜在威胁源
- 严格执行 “输出上下文编码”原则
- CSP策略需强制执行
script-src 'self' - 采用现代化的安全开发框架(如React/Vue的自动转义机制)
项目合理运用防御策略(输入过滤+输出转义+CSP+安全编码),对于预防恶意攻击有前瞻性意义。