Heim >Backend-Entwicklung >PHP-Tutorial >CSRF-Schutz in PHP
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.
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; }
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) });
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']); }
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' ]);
function generateSecureToken($length = 32) { return bin2hex(random_bytes($length)); }
function validateToken($userToken, $storedToken) { if (empty($userToken) || empty($storedToken)) { return false; } return hash_equals($storedToken, $userToken); }
class CSRFProtection { public static function getTokenField() { return sprintf( '<input type="hidden" name="csrf_token" value="%s">', htmlspecialchars($_SESSION['csrf_token']) ); } }
Viele PHP-Frameworks bieten integrierten CSRF-Schutz:
// 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; }
// 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) });
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!