跨站脚本攻击(XSS)是一种常见的Web安全漏洞,攻击者通过在网页中注入恶意脚本,来窃取用户数据、劫持用户会话或执行其他恶意操作。XSS攻击主要分为三种类型:存储型XSS、反射型XSS和基于DOM的XSS。
1. 存储型XSS(Stored XSS)
描述: 存储型XSS攻击是指恶意脚本被存储在服务器上,并在用户访问受感染的页面时执行。常见的存储位置包括数据库、日志文件、评论系统等。
示例:
- 攻击者在评论区提交恶意脚本:
<script>alert('XSS Attack');</script>
- 该脚本被存储在服务器的数据库中。
- 当其他用户访问包含该评论的页面时,恶意脚本被执行。
2. 反射型XSS(Reflected XSS)
描述: 反射型XSS攻击是指恶意脚本通过URL参数或表单提交被注入,并在服务器响应中反射回用户浏览器执行。反射型XSS通常通过钓鱼邮件或恶意链接传播。
示例:
- 攻击者构造一个恶意链接:
http://example.com/search?q=<script>alert('XSS Attack');</script>
- 用户点击该链接,服务器将URL参数中的恶意脚本反射回响应中。
- 用户浏览器执行恶意脚本。
3. 基于DOM的XSS(DOM-based XSS)
描述: 基于DOM的XSS攻击是指恶意脚本通过修改页面的DOM结构直接在客户端执行,而不经过服务器。攻击者利用JavaScript操作DOM节点,注入恶意代码。
示例:
- 攻击者构造一个恶意链接:
http://example.com/#<script>alert('XSS Attack');</script>
- 用户点击该链接,浏览器解析URL片段并执行恶意脚本。
防御措施
-
输入验证: 对所有用户输入进行严格的验证,确保输入数据符合预期格式和范围。
const username = req.body.username; if (!/^[a-zA-Z0-9]+$/.test(username)) { return res.status(400).send('Invalid username'); }
-
输出转义: 对所有输出到HTML页面的内容进行转义,防止特殊字符被解释为HTML或JavaScript代码。
function escapeHTML(str) { return str.replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }
-
使用安全的库和框架: 使用经过安全审计的库和框架,避免手动处理复杂的安全逻辑。
const express = require('express'); const helmet = require('helmet'); const app = express(); app.use(helmet()); // 使用Helmet中间件提高安全性
-
内容安全策略(CSP): 配置内容安全策略,限制页面可以加载的资源,防止恶意脚本执行。
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted.cdn.com">