Heim > Backend-Entwicklung > PHP-Tutorial > CSRF-Schutz in PHP

CSRF-Schutz in PHP

Patricia Arquette
Freigeben: 2024-12-09 04:41:11
Original
342 Leute haben es durchsucht

CSRF Protection in PHP

Was ist CSRF?

Cross-Site Request Forgery (CSRF) ist eine Web-Sicherheitslücke, die es einem Angreifer ermöglicht, authentifizierte Benutzer dazu zu verleiten, unerwünschte Aktionen auf einer Website auszuführen, auf der sie gerade angemeldet sind. Der Angriff funktioniert, indem er das Vertrauen einer Website ausnutzt im Browser eines Benutzers.

Wie CSRF-Angriffe funktionieren

  1. Der Benutzer meldet sich auf der legitimen Website A an und erhält ein Sitzungscookie
  2. Benutzer besucht bösartige Website B, während er noch bei A angemeldet ist
  3. Website B enthält Code, der eine Anfrage an Website A stellt
  4. Der Browser fügt automatisch das Sitzungscookie ein
  5. Website A verarbeitet die Anfrage in der Annahme, sie sei legitim

CSRF-Schutzmethoden in PHP

1. Tokenbasierter Schutz mit versteckter Eingabe

Dies ist die gebräuchlichste Methode. So implementieren Sie es:

// In your session initialization (e.g., at login)
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// In your form
function generateFormWithCSRFToken() {
    return '<form method="POST" action="/submit">
        <input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">
        <!-- rest of your form fields -->
        <input type="submit" value="Submit">
    </form>';
}

// In your form processing
function validateCSRFToken() {
    if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token']) ||
        !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
        die('CSRF token validation failed');
    }
    return true;
}
Nach dem Login kopieren
Nach dem Login kopieren

2. CSRF-Schutz mit benutzerdefinierten Headern

Diese Methode verwendet AJAX-Anfragen mit benutzerdefinierten Headern:

// PHP Backend
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Validate the token
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $headers = getallheaders();
    if (!isset($headers['X-CSRF-Token']) || 
        !hash_equals($_SESSION['csrf_token'], $headers['X-CSRF-Token'])) {
        http_response_code(403);
        die('CSRF token validation failed');
    }
}

// JavaScript Frontend
const csrfToken = '<?php echo $_SESSION["csrf_token"]; ?>';

fetch('/api/endpoint', {
    method: 'POST',
    headers: {
        'X-CSRF-Token': csrfToken,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(data)
});
Nach dem Login kopieren
Nach dem Login kopieren

3. Cookie-Muster doppelt einreichen

Bei dieser Methode wird das Token sowohl als Cookie als auch als Anforderungsparameter gesendet:

// Set both cookie and session token
session_start();
$token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $token;
setcookie('csrf_token', $token, [
    'httponly' => true,
    'secure' => true,
    'samesite' => 'Strict'
]);

// Validation function
function validateDoubleSubmitToken() {
    if (!isset($_COOKIE['csrf_token']) || 
        !isset($_POST['csrf_token']) || 
        !isset($_SESSION['csrf_token'])) {
        return false;
    }

    return hash_equals($_COOKIE['csrf_token'], $_POST['csrf_token']) && 
           hash_equals($_SESSION['csrf_token'], $_POST['csrf_token']);
}
Nach dem Login kopieren

4. SameSite-Cookie-Attribut

Moderne Anwendungen können auch das SameSite-Cookie-Attribut als zusätzliche Schutzebene verwenden:

// Set cookie with SameSite attribute
session_start();
session_set_cookie_params([
    'lifetime' => 0,
    'path' => '/',
    'domain' => $_SERVER['HTTP_HOST'],
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict'
]);
Nach dem Login kopieren

Best Practices für den CSRF-Schutz

  1. Token-Generierung
    • Verwenden Sie kryptografisch sichere Zufallszahlengeneratoren
    • Machen Sie Token ausreichend lang (mindestens 32 Byte)
    • Generieren Sie für jede Sitzung neue Token
function generateSecureToken($length = 32) {
    return bin2hex(random_bytes($length));
}
Nach dem Login kopieren
  1. Token-Validierung
    • Verwenden Sie zeitsichere Vergleichsfunktionen
    • Vorhandensein und Wert des Tokens validieren
    • Implementieren Sie eine ordnungsgemäße Fehlerbehandlung
function validateToken($userToken, $storedToken) {
    if (empty($userToken) || empty($storedToken)) {
        return false;
    }
    return hash_equals($storedToken, $userToken);
}
Nach dem Login kopieren
  1. Formularimplementierung
    • Token in allen Formen einbeziehen
    • Automatische Token-Injektion implementieren
    • Behandeln Sie die Token-Rotation
class CSRFProtection {
    public static function getTokenField() {
        return sprintf(
            '<input type="hidden" name="csrf_token" value="%s">',
            htmlspecialchars($_SESSION['csrf_token'])
        );
    }
}
Nach dem Login kopieren

Framework-spezifischer Schutz

Viele PHP-Frameworks bieten integrierten CSRF-Schutz:

Laravel-Beispiel

// In your session initialization (e.g., at login)
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// In your form
function generateFormWithCSRFToken() {
    return '<form method="POST" action="/submit">
        <input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">
        <!-- rest of your form fields -->
        <input type="submit" value="Submit">
    </form>';
}

// In your form processing
function validateCSRFToken() {
    if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token']) ||
        !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
        die('CSRF token validation failed');
    }
    return true;
}
Nach dem Login kopieren
Nach dem Login kopieren

Symfony-Beispiel

// PHP Backend
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Validate the token
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $headers = getallheaders();
    if (!isset($headers['X-CSRF-Token']) || 
        !hash_equals($_SESSION['csrf_token'], $headers['X-CSRF-Token'])) {
        http_response_code(403);
        die('CSRF token validation failed');
    }
}

// JavaScript Frontend
const csrfToken = '<?php echo $_SESSION["csrf_token"]; ?>';

fetch('/api/endpoint', {
    method: 'POST',
    headers: {
        'X-CSRF-Token': csrfToken,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(data)
});
Nach dem Login kopieren
Nach dem Login kopieren

Häufige Fallstricke, die es zu vermeiden gilt

  1. Verwenden Sie keine vorhersehbaren Token
  2. Speichern Sie Token nicht in global zugänglichen JavaScript-Variablen
  3. Überspringen Sie nicht den CSRF-Schutz für AJAX-Anfragen
  4. Verlassen Sie sich nicht nur auf die Überprüfung des Referer-Headers
  5. Verwenden Sie nicht dasselbe Token für mehrere Formulare

Der CSRF-Schutz ist für die Sicherheit von Webanwendungen von entscheidender Bedeutung. Während es mehrere Ansätze zur Implementierung des CSRF-Schutzes gibt, bleibt der tokenbasierte Ansatz mit versteckten Formularfeldern die am weitesten verbreitete und zuverlässigste Methode. Denken Sie daran, verschiedene Schutzmethoden zu kombinieren, um die Sicherheit zu erhöhen, und befolgen Sie bei der Implementierung des CSRF-Schutzes in Ihren PHP-Anwendungen stets die bewährten Sicherheitsmethoden.

Denken Sie daran, dass der CSRF-Schutz Teil einer umfassenderen Sicherheitsstrategie sein sollte, die eine ordnungsgemäße Sitzungsverwaltung, sichere Cookie-Verarbeitung und Eingabevalidierung umfasst.

Das obige ist der detaillierte Inhalt vonCSRF-Schutz in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage