Heim >Backend-Entwicklung >PHP-Tutorial >Warum sind meine CSRF-Tokens manchmal leer, wenn sie in AJAX- und Standardformularen verwendet werden, und wie kann ich das in PHP beheben?

Warum sind meine CSRF-Tokens manchmal leer, wenn sie in AJAX- und Standardformularen verwendet werden, und wie kann ich das in PHP beheben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-14 20:46:13648Durchsuche

Why are my CSRF tokens sometimes empty when used in AJAX and standard forms, and how can I fix this in PHP?

Formulare mit ordnungsgemäßer CSRF-Token-Implementierung in PHP sichern

Frage:


< ;p>Beim Versuch, ein CSRF-Token zu zwei verschiedenen Formularen hinzuzufügen, eines mit AJAX und das andere ein einfaches Kontaktformular, wird beobachtet, dass der Token-Wert im HTML sporadisch leer ist. Wie kann dieses Problem gelöst werden?

Antwort:

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.

Generieren starker CSRF-Tokens:

Ersetzen Sie die Token-Generierung durch sichere Methoden für PHP 7 oder PHP 5.3 :

PHP 7


session_start();
if (empty($_SESSION['token'])) {

$_SESSION['token'] = bin2hex(random_bytes(32));

}
$token = $_SESSION['token'];

PHP 5.3 (oder mit ext-mcrypt)


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'];

CSRF-Tokens überprüfen:

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
}

}

Per -Form-Token-Einschränkungen:

Um Token weiter auf bestimmte Formen einzuschränken, verwenden Sie hash_hmac():


echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);

?>" />

Hybrider Ansatz mit Twig-Integration:

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:



Single-Use-CSRF-Tokens:

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!

Stellungnahme:
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