PHP如何防止CSRF攻击?

2025-12发布14次浏览

在PHP中防止跨站请求伪造(CSRF)攻击是一个重要的安全措施。CSRF攻击利用用户已经通过身份验证的浏览器发送恶意请求,从而执行非用户意图的操作。以下是几种在PHP中防止CSRF攻击的方法:

  1. 使用令牌(Token): 令牌是一种在用户会话中生成和验证的随机字符串。每次用户提交表单时,都应该生成一个新的令牌,并将其嵌入到表单中。服务器在处理表单提交时,会验证令牌的有效性。如果令牌不匹配或不存在,则拒绝处理请求。

    示例代码:

    // 生成令牌
    function generateToken() {
        return bin2hex(random_bytes(32));
    }
    
    // 在表单中嵌入令牌
    $token = generateToken();
    $_SESSION['csrf_token'] = $token;
    echo '<input type="hidden" name="csrf_token" value="' . $token . '">';
    
    // 验证令牌
    if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF token validation failed');
    }
    
  2. 检查Referer头: Referer头包含了发起请求的原始URL。通过检查Referer头,可以验证请求是否来自合法的来源。然而,这种方法并不完全可靠,因为Referer头可能会被伪造或省略。

    示例代码:

    $referer = $_SERVER['HTTP_REFERER'];
    if ($referer !== "https://your-allowed-origin.com") {
        die('Invalid Referer');
    }
    
  3. 使用SameSite Cookie属性: SameSite属性可以防止浏览器在跨站请求中发送Cookie。通过设置SameSite属性为StrictLax,可以提高安全性。

    示例代码:

    setcookie('session_id', 'value', [
        'expires' => time() + 86400,
        'path' => '/',
        'domain' => 'example.com',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'Strict'
    ]);
    
  4. 使用自定义请求头: 通过要求客户端在请求中包含自定义请求头,可以增加CSRF攻击的难度。服务器在处理请求时,会验证自定义请求头的存在和有效性。

    示例代码:

    // 客户端在请求中包含自定义请求头
    // 例如:Authorization: Bearer YOURCustomToken
    
    // 服务器验证请求头
    if (!isset($_SERVER['HTTP_AUTHORIZATION']) || $_SERVER['HTTP_AUTHORIZATION'] !== 'Bearer YOURCustomToken') {
        die('Invalid request header');
    }
    

通过结合使用这些方法,可以有效地防止CSRF攻击,提高应用程序的安全性。每种方法都有其优缺点,实际应用中可以根据具体需求选择合适的方法。