1. 什么是XSS?
XSS (Cross-Site Scripting) 是一种代码注入攻击,攻击者通过在Web页面中注入恶意脚本,使这些脚本在其他用户的浏览器中执行,从而窃取敏感信息、劫持用户会话或进行其他恶意操作。
为什么叫XSS而不是CSS? 为了避免与层叠样式表(Cascading Style Sheets)混淆。
2. XSS攻击类型
2.1 存储型XSS (Stored XSS)
最危险的类型,恶意脚本被永久存储在服务器上(如数据库、文件系统),每个访问用户都会执行。
攻击流程:
CodeBlock Loading...
攻击示例:
CodeBlock Loading...
2.2 反射型XSS (Reflected XSS)
恶意脚本通过URL参数传递,服务器将其反射回响应页面中,脚本在受害者浏览器中执行。
攻击流程:
CodeBlock Loading...
脆弱代码示例:
CodeBlock Loading...
2.3 DOM型XSS (DOM-based XSS)
攻击完全发生在客户端,恶意脚本通过修改页面DOM环境来执行,服务器端无法检测。
攻击示例:
CodeBlock Loading...
3. XSS的危害
- 🔓 窃取Cookie和会话Token: 劫持用户账户
- 🎭 冒充用户身份: 以用户名义执行操作
- 🕵️ 记录键盘输入: 窃取密码、信用卡等敏感信息
- 🎣 钓鱼攻击: 在页面中插入虚假登录表单
- 🦠 传播蠕虫: 在社交网络中自动复制传播
- 📍 获取地理位置: 利用浏览器API获取用户位置
- 💻 加密货币挖矿: 利用受害者计算资源
4. 防护策略
4.1 输入验证与过滤
永远不要信任用户输入,对所有输入进行严格验证:
CodeBlock Loading...
使用示例:
CodeBlock Loading...
4.2 输出编码
根据上下文使用正确的编码方式:
CodeBlock Loading...
在模板中使用安全编码:
CodeBlock Loading...
4.3 内容安全策略 (CSP)
CSP是一个额外的安全层,用于检测和缓解某些类型的攻击,包括XSS和数据注入攻击。
Gin框架实现CSP:
CodeBlock Loading...
CSP指令说明:
| 指令 | 说明 | 示例 |
|---|---|---|
default-src | 默认策略 | 'self' 只允许同源 |
script-src | JavaScript来源 | 'self' https://cdn.example.com |
style-src | CSS来源 | 'self' 'unsafe-inline' |
img-src | 图片来源 | 'self' https: data: |
connect-src | AJAX/WebSocket来源 | 'self' https://api.example.com |
frame-ancestors | 可嵌入此页面的源 | 'none' 禁止被iframe嵌入 |
4.4 HttpOnly和Secure Cookie
防止JavaScript访问敏感Cookie:
CodeBlock Loading...
4.5 使用安全的DOM操作
在前端避免使用危险的API:
CodeBlock Loading...
4.6 实施Web应用防火墙(WAF)
使用WAF检测和阻止XSS攻击:
CodeBlock Loading...
5. 防护实战案例
5.1 评论系统的XSS防护
CodeBlock Loading...
5.2 搜索功能的XSS防护
CodeBlock Loading...
6. XSS防护总结
防护清单:
- ✅ 对所有用户输入进行验证和过滤
- ✅ 根据输出上下文使用正确的编码(HTML/JavaScript/URL)
- ✅ 实施严格的内容安全策略(CSP)
- ✅ 使用HttpOnly和Secure标志保护Cookie
- ✅ 避免在前端使用危险的DOM API
- ✅ 使用现代框架的自动转义功能
- ✅ 部署Web应用防火墙进行深度防御
- ✅ 定期进行安全扫描和渗透测试
核心防护原则:
- 输入验证
- 验证所有用户输入的格式和内容
- 输出编码
- 根据上下文正确编码输出
- CSP策略
- 限制脚本执行来源
- Cookie保护
- 使用HttpOnly和Secure属性
- 框架支持
- 利用现代框架的内置保护
总结
XSS攻击是Web应用面临的最普遍威胁之一,但通过多层防御策略可以有效防护:
记住: XSS防护不是单一措施,而是多层防御的组合。每一层防护都可能被绕过,但多层组合能大大提高攻击难度。