Wie funktioniert die Nonce-Überprüfung?

14

Ich kann sehen, dass wp_nonce_field einen Wert im versteckten Feld erzeugt.

<input type="hidden" id="message-send" name="message-send" value="cabfd9e42d" />

Aber wp_verify_nonce verwendet diesen Wert nicht, soweit ich das beurteilen kann, aber ich kann mich irren.

Es sieht so aus, als würde ein Sitzungstoken zur Überprüfung verwendet.

$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 );
 if ( hash_equals( $expected, $nonce ) ) 
  { return 1;  }

Was nützt es dann, ein Wertattribut im ausgeblendeten Feld zu haben?

ed-ta
quelle
1
Sie haben dort auch den $nonceWert - die Prüfung gibt false zurück, wenn der $nonceWert fehlt.
Birgire
Ja, ich habe das gesehen, aber es überprüft nur, ob es nicht leer ist, damit es irgendetwas sein kann
ed-ta
Wir haben auch den $nonceWert in diesem Vergleich:hash_equals( $expected, $nonce )
Birgire
Das ist richtig. Ich habe mich auf den Wert konzentriert.
Ed-Ta

Antworten:

15

TL; DR

Kurz gesagt, wp_verify_nonce() verwendet diesen Wert, da er diesen Wert als erstes Argument erwartet .

wp_verify_nonce() Argumente

wp_verify_nonce() erhält 2 Argumente:

  1. $nonce
  2. $action

Der Wert im ausgeblendeten Feld ( 'cabfd9e42d'in Ihrem Beispiel) steht für $nonce.

Das erste Argument ist das Nonce und stammt aus der Anfrage

In der Tat wp_verify_nonce()müssen wie folgt verwendet werden:

// here I assume that the form is submitted using 'post' as method

$verify = wp_verify_nonce($_POST['message-send']);

Das erste Argument, an das übergeben wird, wp_verify_nonce()ist also genau der Wert, der im ausgeblendeten Feld vorhanden ist.

2. Argument: die wp_create_nonce()Methode

Das zweite Argument hängt davon ab, wie Sie den Nonce-Wert erstellen.

ZB wenn du getan hast:

<?php $nonce = wp_create_nonce( 'custom-action' ); ?>
<input type="hidden" name="message-send" value="<?php echo $nonce ?>" />

Dann müssen Sie Folgendes tun:

$verify = wp_verify_nonce( $_POST['message-send'], 'custom-action' );

Das zweite Argument wurde also als Argument für verwendet wp_create_nonce().

2. Argument: die wp_nonce_field()Methode

Wenn Sie die Nonce mit wp_nonce_field()like erstellt haben:

wp_nonce_field( 'another_action', 'message-send' );

Dann müssen Sie die Nonce wie folgt verifizieren:

$verify = wp_verify_nonce( $_POST['message-send'], 'another_action' );

Diesmal ist die Aktion also alles, was als erstes Argument an übergeben wurde wp_nonce_field().

Rekapitulieren

Um die wp_verify_nonce()Validierung zu bestehen, müssen Sie 2 Argumente an die Funktion übergeben, eines ist der Wert im Feld nonce hidden, das andere ist die Aktion und hängt davon ab, wie der Wert nonce erstellt wurde.

gmazzap
quelle
4
@ Birgire Ich mache Tippfehler wie ein Profi :)
gmazzap
2
Zumindest gibt es auf der Website einige professionelle englische Redakteure, die uns nicht-muttersprachlichen englischen Schreibern dabei helfen, unsere Tippfehler zu beseitigen, lol ;-). Großartige Erklärung BTW, +1
Pieter Goosen