Nonce generiert vor 0-12 Stunden

In WordPress gibt es einen Nonce-erzeugenden / verifizierenden Mechanismus, und ich habe Probleme zu verstehen, warum es nicht richtig funktioniert …

Zu einem Zeitpunkt wird geprüft, ob die Nonce vor 0-12 Stunden generiert wurde.

wp-includes \ pluggable.php: 1260

function wp_verify_nonce($nonce, $action = -1) { $user = wp_get_current_user(); $uid = (int) $user->ID; if ( ! $uid ) $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); $i = wp_nonce_tick(); // Nonce generated 0-12 hours ago if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce ) return 1; // Nonce generated 12-24 hours ago if ( substr(wp_hash(($i - 1) . $action . $uid, 'nonce'), -12, 10) == $nonce ) return 2; // Invalid nonce return false; } 

Wie funktioniert das, if Arbeit?

 // Nonce generated 0-12 hours ago if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce ) 

Ich sehe das wp_hash($i . $action . $uid, 'nonce') = 8ae70558afac4a6951e3bc0f9ef1f59a
und $nonce = 3551 . Wie soll $nonce verglichen werden mit -12,10 th Teil von 8ae70558afac4a6951e3bc0f9ef1f59a soll ein Check für “0-12 Stunden” sein?

Solutions Collecting From Web of "Nonce generiert vor 0-12 Stunden"

WordPress-Nonces sind nicht Ihre gewöhnliche (“nur einmal benutzen”) Nonce. Für eine gegebene $action wird eine neue Nonce alle 12 Stunden erzeugt und eine Nonce ist 24 Stunden lang gültig, so dass zu jedem gegebenen Zeitpunkt zwei Nonces für eine gegebene $action gültig sind.

Die Nonce ist (ein Teilstring von) ein Hash von

  • $action – die Aktion
  • $uid – die Benutzer-ID
  • $i – Inkrement.

Die Inkremente werden alle 12 Stunden um 1 erhöht. Wenn also die aktuelle Nonce für einen bestimmten Benutzer und eine bestimmte Aktion ein Teilstring von ist

 wp_hash($i . $action . $uid, 'nonce') 

Dann ist die vorherige Nonce (für denselben Benutzer und dieselbe Aktion) eine Teilzeichenfolge von

 wp_hash(($i - 1) . $action . $uid, 'nonce') 

Da beide gültige Nonces sind, überprüfen Sie Ihre empfangene $nonce beide für eine Übereinstimmung.

Ich möchte eine ausführlichere Erklärung dazu geben, wie WordPress NONCEs wirklich funktionieren . Außerdem muss die akzeptierte Antwort mit genaueren Informationen aktualisiert werden, da WordPress beim Erstellen der Nonce auch das Sitzungstoken berücksichtigt. Der Link ist ein langer Artikel, den ich mit ausführlicheren Erklärungen geschrieben habe.

Erstens sagt die angenommene Antwort nicht, wie das if funktioniert.

Also lass uns sezieren, sollen wir? Beachten Sie, dass ich die aktuelle Version der statement verwende, da jetzt auch das Sitzungstoken des Benutzers berücksichtigt wird

 $expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); 

Die PHP-function substr() gibt einen Teil der Zeichenkette zurück.

Hier ist die Auswertung von wp_hash() der String, den substr() auswerten und zurückgeben wird. Das Argument -12 besagt, dass 12 Zeichen vom Ende der Zeichenfolge (das Ergebnis der wp_hash() von wp_hash() ) gezählt werden, substr beginnt am Ende, weil das Minuszeichen dies wp_hash() .

Schließlich sagt das letzte Argument 10 , dass 10 Zeichen als Unterzeichenfolge zurückgegeben werden sollen .

Zählen Sie also 12 Zeichen vom Ende und geben Sie dann 10 zurück, so dass die letzten 2 Zeichen aus dem zurückgegebenen Ergebnis entfernt werden.

Wenn Sie ein WordPress NONCE überprüfen, enthält es genau 10 Zeichen.

Ein weiterer Punkt, den ich klären möchte, ist die Lebensdauer eines WP NONCE.

Wir sollten nicht sagen, dass ein Nonce 24 Stunden gültig ist, da es in Wirklichkeit immer weniger ist . Eine NONCE ist für maximal 24 Stunden, mindestens 12 Stunden gültig. Besser gesagt, es gilt für 2 Ticks.

Ein Tick, wie Stephen Harris erklärte, ist ein Anstieg der aktuellen Lebensdauer der NONCE.

Und standardmäßig stellt ein Tick 12 Stunden dar, berechnet aus der UTC-Zeit. Um Mitternacht +1 Sekunde und Mittag +1 Sekunde wird der Tick-Wert um 1 Einheit erhöht.

Wenn das $token bleibt (der Benutzer hat sich nicht ab- und wieder wp_hash() ), gibt wp_hash() immer den gleichen Hash für eine bestimmte Aktion und Benutzer-ID zurück.

Dies bleibt wahr, bis der aktuelle Tick-Wert um 1 inkrementiert wird. In diesem Fall wird der Hash für dieselbe Aktion, dieselbe Benutzer-ID und dasselbe Token unterschiedlich sein.

So betrachtet WordPress eine Nonce, die vor 0-12 Stunden erstellt wurde .

WordPress betrachtet auch eine gültige Nonce, die vor 12-24 Stunden erstellt wurde, indem die Nonce mit der Hash-function verglichen wird, wobei der vorherige Tick-Wert verwendet wird. Aber das ist irreführend, wie ich bereits erwähnt habe. Der Zeitraum von 12-24 Stunden bezieht sich nicht auf die tatsächliche explizite Erstellungszeit einer gegebenen NONCE (mit anderen Worten, es verwendet nicht den Zeitstempel der Nonce-Erstellung), sondern sagt eher in dem Zeitraum von 12-24 Stunden, da dies der Fall ist Schöpfung . Was sich eigentlich auf einen eindeutigen Tick-Wert bezieht (1 weniger als der aktuelle)

Es wäre weniger verwirrend, wenn wir die Nonce-Validität in Bezug auf Ticks und nicht in Stunden betrachten würden.

Also wäre der beste Weg, die Gültigkeit zu beschreiben

  • 0-12 Stunden == aktueller Tick-Wert == t
  • 12-24 Stunden == aktueller Tick-Wert – 1 == vorheriger Tick-Wert == t – 1

Ich hoffe, ich habe die Dinge klarer gemacht