PHP

如何防止PHP中的CSRF攻击

小樊
86
2024-09-12 15:39:58
栏目: 编程语言

要防止PHP中的跨站请求伪造(CSRF)攻击,可以采取以下几种方法:

  1. 使用CSRF令牌:为每个用户会话生成一个唯一的CSRF令牌,并将其存储在用户的会话中。在表单中包含一个隐藏字段,其中包含CSRF令牌。当用户提交表单时,将令牌与服务器上存储的令牌进行比较。如果令牌不匹配,则拒绝请求。
// 生成CSRF令牌
session_start();
$csrf_token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $csrf_token;

// 在表单中包含CSRF令牌
<form action="submit.php" method="post">
  <!-- 其他表单字段 -->
 <input type="hidden" name="csrf_token" value="<?php echo $csrf_token; ?>">
 <input type="submit" value="提交">
</form>

// 验证CSRF令牌
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    // 令牌不匹配,拒绝请求
    die("Invalid CSRF token.");
  }
  // 继续处理表单数据
}
  1. 同源策略:确保只有来自同一来源的请求才能访问您的应用程序。这可以通过设置HTTP响应头Content-Security-Policy来实现。
header('Content-Security-Policy: default-src \'self\'');
  1. 双重cookie提交:在客户端和服务器端都存储CSRF令牌。当用户提交表单时,将令牌从cookie发送到服务器。然后,将cookie中的令牌与服务器端的令牌进行比较。如果令牌不匹配,则拒绝请求。
// 设置CSRF令牌cookie
session_start();
$csrf_token = bin2hex(random_bytes(32));
setcookie('csrf_token', $csrf_token, 0, '/');
$_SESSION['csrf_token'] = $csrf_token;

// 在表单中包含CSRF令牌
<form action="submit.php" method="post">
  <!-- 其他表单字段 -->
 <input type="hidden" name="csrf_token" value="<?php echo $_COOKIE['csrf_token']; ?>">
 <input type="submit" value="提交">
</form>

// 验证CSRF令牌
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    // 令牌不匹配,拒绝请求
    die("Invalid CSRF token.");
  }
  // 继续处理表单数据
}
  1. 使用SameSite cookie属性:通过设置cookie的SameSite属性为Strict或Lax,可以防止浏览器在跨站点请求中发送cookie。这样,当用户访问第三方网站时,浏览器将不会发送您的应用程序的cookie,从而防止CSRF攻击。
setcookie('csrf_token', $csrf_token, 0, '/', '', false, true);
  1. 使用HTTPS:使用安全的HTTP连接(HTTPS)可以防止中间人攻击,从而保护用户的数据和会话信息。

结合以上方法,可以有效地防止PHP中的CSRF攻击。

0
看了该问题的人还看了