返回

CSRF跨站请求伪造及其保护demo

前端

CSRF 跨站请求伪造简介

跨站请求伪造(CSRF)是一种利用用户浏览器和服务器之间信任发送恶意请求的攻击方法。CSRF攻击者可以诱骗受害者访问他们的恶意网站或点击他们的恶意链接,从而发送恶意请求到受害者的服务器。恶意请求通常是向受害者的服务器发送一个修改过的HTTP请求,该请求包含受害者的认证信息(如Cookie或Session ID)。服务器收到恶意请求后,会以为它是来自受害者的,从而执行请求中的操作。这样,攻击者就可以在受害者不知情的情况下,以受害者的身份在受害者的服务器上执行任意操作。

CSRF跨站请求伪造的原理

CSRF攻击的原理很简单,它利用了浏览器在访问不同网站时自动携带Cookie的机制。当用户访问一个网站时,浏览器会自动将该网站的Cookie发送给服务器。服务器收到Cookie后,会根据Cookie中的信息来判断用户的身份。如果用户已经登录了该网站,那么服务器会将用户的信息加载到该用户对应的Session中。这样,当用户访问该网站的其他页面时,浏览器会自动将该网站的Cookie发送给服务器,服务器收到Cookie后,会根据Cookie中的信息来获取用户在Session中的信息,并根据用户的信息来对用户的请求进行处理。

CSRF跨站请求伪造的解决方案

CSRF攻击是一种比较严重的攻击,它可以使攻击者在受害者不知情的情况下,以受害者的身份在受害者的服务器上执行任意操作。为了防止CSRF攻击,可以使用以下几种方法:

  1. 使用CSRF Token

CSRF Token是一种可以防止CSRF攻击的有效方法。CSRF Token是一个随机生成的字符串,它会存储在用户的Session中。当用户访问一个网站时,浏览器会将CSRF Token发送给服务器。服务器收到CSRF Token后,会将它与Session中的CSRF Token进行比较。如果两个CSRF Token相同,那么服务器会认为该请求是合法的,否则会认为该请求是恶意的。

  1. 使用HTTP Referer

HTTP Referer是一个HTTP头字段,它包含了当前请求的来源地址。当浏览器发送一个请求时,它会将HTTP Referer头字段添加到请求中。服务器收到请求后,可以检查HTTP Referer头字段来判断请求的来源地址。如果HTTP Referer头字段的值是合法的,那么服务器会认为该请求是合法的,否则会认为该请求是恶意的。

CSRF跨站请求伪造保护Demo

以下是一个CSRF保护的demo,演示了如何使用CSRF Token来防止CSRF攻击。

<?php
session_start();

// 生成CSRF Token
$csrf_token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $csrf_token;

// 检查CSRF Token
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
  // 处理表单提交
} else {
  // 拒绝表单提交
}
?>

<form action="process.php" method="post">
  <input type="hidden" name="csrf_token" value="<?php echo $csrf_token; ?>">
  <input type="text" name="username">
  <input type="password" name="password">
  <input type="submit" value="登录">
</form>

这个demo中,当用户提交表单时,浏览器会将CSRF Token发送给服务器。服务器收到CSRF Token后,会将它与Session中的CSRF Token进行比较。如果两个CSRF Token相同,那么服务器会认为该请求是合法的,否则会认为该请求是恶意的。