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
Freigeben: 2024-12-14 20:46:13
Original
657 Leute haben es durchsucht

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));
Nach dem Login kopieren

}
$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));
}
Nach dem Login kopieren

}
$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
}
Nach dem Login kopieren

}

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']);
Nach dem Login kopieren

?>" />

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']);
    }
)
Nach dem Login kopieren

);

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!

Quelle:php.cn
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 Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage