CSRF(Cross-Site Request Forgery,跨站请求伪造)

171 阅读3分钟

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的Web安全漏洞,攻击者通过伪造用户在当前已登录的Web应用中的请求,从而执行恶意操作。这种攻击通常发生在用户已经登录某个Web应用的情况下,攻击者利用用户的登录状态执行非法操作。

CSRF 的原理

  1. 用户登录:用户登录了一个Web应用。
  2. 攻击者构造请求:攻击者创建一个恶意链接或表单,其中包含伪造的请求。
  3. 用户点击:用户点击了这个链接或提交了表单。
  4. 请求发送:用户的浏览器发送请求到Web应用。
  5. 执行操作:Web应用执行了这个请求,因为它认为请求来自合法用户。

CSRF 的危害

  1. 非法操作:攻击者可以利用用户的权限执行非法操作,如转账、更改密码等。
  2. 数据泄露:攻击者可以获取用户的敏感数据。
  3. 权限滥用:攻击者可以滥用用户的权限,执行任意操作。

CSRF 的防御措施

为了防止CSRF攻击,可以采取以下几种防御措施:

1. 使用CSRF Token

最常用的方法是使用CSRF Token。在每个表单或API请求中加入一个唯一的Token,并在服务器端验证这个Token。

实现步骤
  1. 生成Token:在用户登录时生成一个随机的Token,并存储在用户的Session中。
  2. 传递Token:在每个表单或API请求中加入这个Token。
  3. 验证Token:服务器在处理请求时验证Token是否有效。
示例代码
html
<!-- HTML 表单 -->
<form action="/transfer" method="post">
  <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
  <input type="text" name="amount" placeholder="Amount">
  <button type="submit">Transfer</button>
</form>
javascript
// JavaScript 发送请求
fetch('/transfer', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-CSRF-Token': '{{ csrf_token }}'
  },
  body: JSON.stringify({ amount: 100 })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));

2. SameSite Cookie 属性

使用SameSite属性来限制Cookie的发送范围。这可以防止第三方站点通过恶意链接获取用户的Cookie。

示例代码
javascript
// 设置Cookie
document.cookie = 'session=abc123; SameSite=Strict';

3. 验证Referer Header

通过检查Referer头部来验证请求是否来自预期的站点。这种方法有一定的局限性,因为Referer头部可以被篡改。

示例代码
javascript
// 服务器端验证Referer
app.post('/transfer', (req, res) => {
  const referer = req.headers.referer;
  if (referer !== 'https://example.com') {
    return res.status(403).send('Invalid Referer');
  }
  // 处理转账请求
  res.send('Transfer successful');
});

4. 使用双重验证

在执行敏感操作之前,要求用户进行额外的验证,如输入验证码或二次确认。

示例代码
html
<!-- HTML 表单 -->
<form action="/transfer" method="post">
  <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
  <input type="text" name="amount" placeholder="Amount">
  <input type="text" name="captcha" placeholder="Captcha">
  <button type="submit">Transfer</button>
</form>

CSRF 与 XSS 的区别

  • CSRF:攻击者利用用户的登录状态执行非法操作。
  • XSS:攻击者注入恶意脚本,直接在用户的浏览器中执行。

总结

CSRF 攻击是一种常见的Web安全威胁,通过合理的防御措施可以有效地防止这类攻击。以下是一些关键点:

  • 使用CSRF Token:在每个请求中加入一个唯一的Token,并在服务器端验证。
  • 使用SameSite Cookie属性:限制Cookie的发送范围。
  • 验证Referer Header:检查请求来源。
  • 双重验证:要求用户进行额外的验证。

希望这些示例和说明对你有所帮助!如果有更多问题或需要进一步的帮助,请随时提问。