it-swarm.com.de

Nonce vor 0-12 Stunden generiert

In WordPress gibt es einen Nonce-Generierungs-/Überprüfungsmechanismus, und ich habe Probleme zu verstehen, warum er nicht richtig funktioniert ...

An einem Punkt 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 diese if?

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

Ich sehe, dass wp_hash($i . $action . $uid, 'nonce') = 8ae70558afac4a6951e3bc0f9ef1f59a
und $nonce = 3551. Wie soll der Vergleich von $nonce mit dem -12,10-ten Teil von 8ae70558afac4a6951e3bc0f9ef1f59a eine Überprüfung für "vor 0-12 Stunden" sein?

1
laggingreflex

WordPress-Nonces sind nicht Ihre übliche Nonce ("nur einmal verwenden"). Für einen bestimmten $action wird alle 12 Stunden eine neue Nonce generiert, und eine Nonce ist 24 Stunden gültig. Zu einem bestimmten Zeitpunkt gibt es also zwei Nonces, die für einen bestimmten $action gültig sind.

Das Nonce ist (eine Teilzeichenfolge von) ein Hash von

  • $action - die Aktion
  • $uid - die Benutzer-ID
  • $i - Inkrementor.

Die Inkremente werden alle 12 Stunden um 1 erhöht. Wenn also die aktuelle Nonce für einen bestimmten Benutzer und eine bestimmte Aktion eine Teilzeichenfolge 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 beide, wenn Sie Ihren empfangenen $nonce überprüfen, auf eine Übereinstimmung.

3
Stephen Harris

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 jetzt auch das Sitzungstoken beim Erstellen der Nonce berücksichtigt. Der Link ist ein langer Artikel, den ich mit ausführlicheren Erklärungen geschrieben habe.

Erstens sagt die akzeptierte Antwort nicht aus, wie if funktioniert.

also lasst es uns sezieren, sollen wir? Beachten Sie, dass ich die aktuelle Version der Anweisung verwende, da diese jetzt auch das Sitzungstoken des Benutzers berücksichtigt

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

die Funktion PHP substr() gibt einen Teil des Strings zurück.

Hier ist die Auswertung von wp_hash() die Zeichenfolge, die substr() auswertet und einen Teil davon zurückgibt. Das Argument -12 besagt, dass12 Zeichen ab dem Endedes Strings (das Ergebnis der Auswertung von wp_hash()) gezählt werden sollen. substr beginnt wegen des Minuszeichens am Ende es zu sagen, dies zu tun.

Das letzte Argument 10 gibt 10 Zeichen als Unterzeichenfolge zurück.

Zählen Sie also 12 Zeichen vom Ende ab und geben Sie 10 zurück, sodass 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 klarstellen möchte, ist die Lebensdauer einer WP NONCE.

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

Ein Häkchen ist, wie @Stephen Harris erklärte, eine Erhöhung der aktuellen Lebensdauer der NONCE.

Und standardmäßig entspricht ein Häkchen 12 Stunden, berechnet aus der UTC-Zeit. Um Mitternacht + 1 Sekunde und um Mittag + 1 Sekunde wird der Wert des Ticks um die Einheit 1 erhöht.

Da der $token derselbe bleibt (der Benutzer hat sich nicht abgemeldet und ist nicht wieder angemeldet), gibt wp_hash() für eine bestimmte Aktion und Benutzer-ID immer denselben Hash zurück.

Dies bleibt so lange wahr, bis der aktuelle Tick-Wert um 1 erhöht wird. In diesem Fall unterscheidet sich der Hash für dieselbe Aktion, dieselbe Benutzer-ID und dasselbe Token.

Dies ist, wie WordPress eine Nonce als gültig erachtet, die vor0-12 Stundenerstellt wurde.

WordPress hält auch eine Nonce für gültig, die vor12-24 Stundenerstellt wurde, indem die Nonce mit der Hash-Funktion unter Verwendung des vorherigen Tick-Werts verglichen wird. Aber das ist irreführend, wie ich bereits erwähnt habe. Der Zeitraum vor 12-24 Stunden bezieht sich nicht auf die tatsächliche explizite Erstellungszeit einer bestimmten NONCE (mit anderen Worten:not usingthetimestampof the nonce creation), sondern sagt in dem Zeitraum von 12-24 Stunden seit seiner Erstellung . Was sich tatsächlich auf einen eindeutigen Tick-Wert bezieht (1 weniger als der aktuelle)

Es wäre weniger verwirrend, wenn wir die Nichtgültigkeit in Bezug auf Zecken und nicht in Bezug auf Stunden betrachten würden.

Der beste Weg, die Gültigkeit zu beschreiben, wäre also

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

Ich hoffe, ich habe die Dinge klarer gemacht

1
bynicolas