Das Problem ist wahrscheinlich auf die Token-Generierungsmethode zurückzuführen, wie es im bereitgestellten Code der Fall ist anfällig für Vorhersagen und Mangel an Entropie. Diese Methode reicht auch für die einmalige und formularmäßige Token-Validierung nicht aus.
Ersetzen Sie die Token-Generierung durch sichere Methoden für PHP 7 oder PHP 5.3 :
session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];
session_start();
if (empty($_SESSION['token'])) {
if (function_exists('mcrypt_create_iv')) { $_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); } else { $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32)); }
}
$token = $_SESSION['token'];
Verwenden Sie hash_equals(), um Token zu überprüfen sicher:
if (!empty($_POST['token'])) {
if (hash_equals($_SESSION['token'], $_POST['token'])) { // Proceed to process the form data } else { // Log this as a warning and keep an eye on these attempts }
}
Um Token weiter auf bestimmte Formen einzuschränken, verwenden Sie hash_hmac():
echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
?>" />
Für diejenigen, die Twig-Vorlagen verwenden, kann eine vereinfachte duale Strategie sein implementiert:
$twigEnv->addFunction(
new \Twig_SimpleFunction( 'form_token', function($lock_to = null) { if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32)); } if (empty($_SESSION['token2'])) { $_SESSION['token2'] = random_bytes(32); } if (empty($lock_to)) { return $_SESSION['token']; } return hash_hmac('sha256', $lock_to, $_SESSION['token2']); } )
);
Mit dieser Funktion können sichere allgemeine Token verwendet werden als:
Während Per-Form-Token generiert werden können mit:
Für einmalige Token-Anforderungen sollten Sie die Verwendung einer dedizierten Bibliothek wie der in Betracht ziehen Anti-CSRF-Bibliothek von Paragon Initiative Enterprises.
Das obige ist der detaillierte Inhalt vonWarum sind meine CSRF-Tokens manchmal leer, wenn sie in AJAX- und Standardformularen verwendet werden, und wie kann ich das in PHP beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!