XSS(跨站脚本攻击)
攻击者向网页注入恶意脚本,当其他用户浏览该页面时,脚本会在用户浏览器中执行。
原理
- 攻击者将恶意脚本注入到一个网页中(例如通过用户输入的表单、评论区或 URL 参数)。
- 受害者访问该网页时,浏览器会执行嵌入的恶意脚本。
- 恶意脚本利用受害者的身份认证信息(如 Cookie)执行操作,例如窃取用户的会话信息、修改网页内容或发送虚假请求。
防御措施
- 输入验证:对用户输入进行严格验证,过滤掉特殊字符(如
<,>,&等)。 - 输出编码:在显示用户输入的内容时,将其编码为 HTML 实体(如
<转换为<)。 - 使用 Content Security Policy (CSP) :限制网页中可以加载的脚本来源。
- 避免使用危险的 JavaScript 方法(如
eval或innerHTML)。 - 使用安全库:如 DOMPurify 来清理 HTML 内容
import DOMPurify from 'dompurify';
const dirtyHTML = '<div><script>alert("XSS!");</script><p>Safe content</p></div>';
const cleanHTML = DOMPurify.sanitize(dirtyHTML);
console.log(cleanHTML); // 输出: <div><p>Safe content</p></div>
CSRF(跨站请求伪造)
攻击者利用受害者的身份认证信息(如 Cookie),在用户不知情的情况下,冒充用户向服务器发送恶意请求,执行未授权的操作。
原理:
- 用户登录目标网站并保持会话。
- 用户访问攻击者控制的网站或点击恶意链接。
- 攻击者利用用户的会话,向目标网站发送伪造的请求。
防御措施
- 使用 CSRF Token:在表单或请求中添加一个随机生成的 Token,服务器验证该 Token 是否匹配
- 验证 Referer 头: 检查请求的来源是否合法
- SameSite Cookie 属性:设置 Cookie 的
SameSite属性为Strict或Lax,限制跨站请求 - 双重验证:对敏感操作(如转账)要求用户进行二次验证(如输入密码或验证码)
总结
| 特性 | XSS | CSRF |
|---|---|---|
| 攻击目标 | 用户浏览器 | 目标网站 |
| 攻击方式 | 注入恶意脚本 | 伪造用户请求 |
| 防御重点 | 输入验证、输出编码、CSP | CSRF令牌、Referer检查、SameSite |
| 危害 | 窃取会话、重定向、钓鱼 | 执行未经授权操作、窃取数据 |