Published on

网络安全

Authors
  • avatar
    Name
    Reeswell
    Twitter

Web 安全

XSS 和 CSRF 攻击

XSS(跨站脚本攻击)

定义:攻击者向网页中注入恶意脚本(通常为 JavaScript),当其他用户访问该页面时,脚本会在用户浏览器中执行,从而窃取用户信息、劫持会话或执行其他恶意操作。

本质:注入并执行脚本,攻击目标是用户浏览器

举例:攻击者在评论区插入 <script>alert('XSS')</script>,其他用户访问页面时弹窗或窃取 Cookie。

防御措施

  • 输入过滤
  • 输出编码(如 HTML 转义)
  • 使用 CSP(内容安全策略)
  • 设置 HTTP Only Cookie

XSS 攻击类型详解

反射型 XSS

  • 恶意脚本通过 URL 参数传递给服务器,服务器未做处理直接返回给浏览器执行
  • 示例:http://example.com/?search=<script>alert(1)</script>

存储型 XSS

  • 攻击者的脚本被存储在服务器上(如数据库、评论、用户资料等),当其他用户访问该页面时,脚本从服务器加载并执行
  • 常见于论坛、博客、社交网站等允许用户提交内容的场景

DOM 型 XSS

  • 不依赖服务器响应,而是由于前端 JavaScript 操作 DOM 不当导致
  • 例如:document.write(location.hash),如果攻击者构造 #<script>alert(1)</script>,则可能触发

XSS 防护核心机制

1. 输入验证与过滤

  • 对所有用户输入进行严格校验,不允许 HTML 标签、特殊字符直接插入
  • 使用白名单机制,仅允许特定标签(如 <b><i>)和属性
  • 工具库如 OWASP 的 Java Encoder、PHP 的 htmlspecialchars、Node.js 的 DOMPurify 可用于清理输入

2. 输出上下文感知的编码

  • 根据输出位置(HTML、JS、CSS、URL)对数据进行相应编码,防止脚本执行
  • HTML 实体编码:<&lt;
  • JavaScript 编码:"\x22
  • URL 编码:空格 → %20

3. 内容安全策略(Content Security Policy, CSP)

  • 通过 HTTP 头 Content-Security-Policy 限制网页中只能加载指定来源的脚本、样式、图片等资源
  • 可以禁止内联脚本(inline script)和 eval(),极大降低 XSS 风险
  • 示例 CSP 头:
    Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com;
    

4. HttpOnly Cookie

  • 设置 Cookie 的 HttpOnly 标志,防止 JavaScript 访问敏感 Cookie(如 session ID)
  • 有效防御因 XSS 导致的会话劫持

XSS 防护能力对比

防御手段防存储型防反射型防 DOM 型错误报告
输入过滤
输出编码
HTTP Only Cookie
CSP

XSS 攻击类型对比

攻击类型存储位置触发方式影响范围危险程度
存储型 XSS服务器数据库用户访问包含恶意脚本的页面持久性,影响所有访问用户
反射型 XSSURL 参数用户点击包含恶意脚本的链接一次性,影响点击用户
基于 DOM 型前端 DOM客户端 JavaScript 处理用户输入本地执行,不经过服务器

CSRF(跨站请求伪造)

定义:攻击者诱导用户在已登录的目标网站上,自动发起非用户本意的请求(如转账、修改密码等),利用用户的身份完成非法操作。

本质:伪造合法请求,攻击目标是服务器端对用户身份的信任

举例:攻击者构造一个隐藏表单或图片,诱导用户点击链接,自动向银行转账接口发起 POST 请求。

防御措施

  • 使用 Anti-CSRF Token(同步令牌模式)
  • 设置 SameSite Cookie 属性
  • 验证 Referer 头

知识补充:XSS 底层原理
浏览器无法区分"合法脚本"和"恶意脚本",只要 HTML 文档中包含 <script> 或可执行的 JS 代码,浏览器都会执行。因此必须在输入和输出环节严格校验和转义,防止恶意代码注入。

CSRF 防护策略

分级防护建议

安全级别适用场景防御措施
基础博客/新闻站SameSite=Lax + 框架默认防护
标准电商/社交网络同步令牌 + SameSite=Strict
高级金融/医疗系统加密令牌 + 关键操作二次认证