面试题库 词条目录
前端Wiki/词条/XSS 与 CSRF

XSS 与 CSRF

定义两类经典前端安全攻击:XSS 注入恶意脚本执行,CSRF 借用户身份发请求

XSS(跨站脚本):恶意脚本被注入页面并在受害者浏览器执行——document.cookie 被偷、钓鱼表单、挂马。防御:① 输出转义(Vue/React 默认转义插值,dangerouslySetInnerHTML/v-html 才危险);② CSP(Content-Security-Policy 限制脚本来源、禁内联);③ HttpOnly 让 JS 读不到 cookie;④ 富文本白名单过滤(DOMPurify)。

CSRF(跨站请求伪造):用户在 A 站登录后,恶意站点 B 发起对 A 的请求(img src、自动提交表单),浏览器自动带上 A 的 cookie,于是以受害者身份完成转账/发帖。防御:① SameSite cookie(Lax/Strict 默认不带跨站请求);② CSRF token(服务器发一次性 token,请求必须带上);③ 关键操作二次确认(验证码/密码)。

HTML
<!-- XSS 防御示例 -->
React/Vue 插值默认转义:{ user.name }  ← 即便 name 含 <script> 也只显示文本

<!-- ✗ 危险:用户输入直接渲染 HTML -->
<div dangerouslySetInnerHTML={{ __html: userInput }} />

<!-- ✓ 富文本场景:DOMPurify 白名单清洗 -->
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(html) }} />

<!-- CSP 头:只允许本源与指定 CDN 的脚本,禁内联事件 -->
<meta http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'self' cdn.x.com; style-src 'self'">

<!-- CSRF 防御示例(同源策略保护下 token 方案) -->
<form action="/transfer" method="POST">
  <input type="hidden" name="csrf_token" value="来自服务器的随机token" />
  <input name="amount" />
  <button>转账</button>
</form>
<!-- SameSite=Lax:浏览器默认对跨站请求不带 cookie -->
⚠ 常见误区
🔗 相关词条浏览器存储HTTP 缓存Cookie 与存储
← 返回来源章节XSS 与 CSRF 安全