CSRF在PHP中的防御机制有哪些

avatar
作者
筋斗云
阅读量:0

在 PHP 中,防御 CSRF(跨站请求伪造)攻击的主要方法包括以下几种:

  1. 使用 CSRF Token:为每个表单生成一个随机的 CSRF Token,并将其存储在用户的会话中。当用户提交表单时,需要同时提交这个 Token,然后在服务器端进行验证。如果 Token 不匹配或者不存在,则拒绝请求。
// 生成 CSRF Token session_start(); $csrf_token = bin2hex(random_bytes(32)); $_SESSION['csrf_token'] = $csrf_token;  // 在表单中添加隐藏字段 echo '<form action="submit.php" method="post">'; echo<input type="hidden" name="csrf_token" value="' . $csrf_token . '">'; // 其他表单字段... echo '</form>';  // 验证 CSRF Token if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {     // 处理表单数据 } else {     // 阻止请求     echo "Invalid CSRF Token!"; } 
  1. 验证 Referer 头部:检查 HTTP 请求的 Referer 头部,确保请求是从可信任的源发起的。这种方法有一定的局限性,因为 Referer 头部可以被伪造或遗漏。
$allowed_origins = ['https://example.com', 'https://subdomain.example.com']; $referer = isset($_SERVER['HTTP_REFERER']) ? parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) : '';  if (in_array($referer, $allowed_origins)) {     // 处理请求 } else {     // 阻止请求     echo "Invalid referer!"; } 
  1. 使用 SameSite Cookies 属性:通过设置 Cookie 的 SameSite 属性为 Strict 或 Lax,可以防止浏览器在跨站点请求时发送 Cookie。这样,当用户访问第三方网站时,攻击者无法利用用户的 Cookie 发起 CSRF 攻击。
setcookie('name', 'value', [     'expires' => time() + 60 * 60 * 24 * 30,     'path' => '/',     'domain' => 'example.com',     'secure' => true,     'httponly' => true,     'samesite' => 'Strict', // 或 'Lax' ]); 
  1. 用户交互确认:对于一些敏感操作,如转账、修改密码或删除账户等,可以通过增加用户交互步骤(如确认弹窗、输入验证码或者二次认证来进行操作确认)降低 CSRF 攻击的风险。

结合以上方法,可以有效地防御 CSRF 攻击。但请注意,没有绝对安全的系统,始终保持警惕和更新防御措施是非常重要的。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!