Come funziona la verifica del nonce?

12 lug 2015, 20:01:00
Visualizzazioni: 13.9K
Voti: 15

Posso vedere che wp_nonce_field genera un valore nel campo hidden.

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

Ma wp_verify_nonce non sembra utilizzare quel valore per quanto ne so, anche se potrei sbagliarmi.

Sembra che utilizzi un token di sessione per la verifica.

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

Allora qual è lo scopo di avere un attributo value nel campo hidden?

4
Commenti

Hai anche il valore $nonce lì - il controllo restituisce false se il valore $nonce manca.

birgire birgire
12 lug 2015 20:54:38

Sì, l'ho visto, ma controlla solo che non sia vuoto quindi potrebbe essere qualsiasi cosa

ed-ta ed-ta
12 lug 2015 23:03:38

abbiamo anche il valore $nonce in questo confronto: hash_equals( $expected, $nonce )

birgire birgire
13 lug 2015 00:13:04

È vero. Mi stavo concentrando sul valore.

ed-ta ed-ta
13 lug 2015 00:18:20
Tutte le risposte alla domanda 1
2
16

TL;DR

In breve, wp_verify_nonce() utilizza quel valore perché si aspetta quel valore come primo argomento.

Argomenti di wp_verify_nonce()

wp_verify_nonce() riceve 2 argomenti:

  1. $nonce
  2. $action

Il valore nel campo hidden ('cabfd9e42d' nel tuo esempio) rappresenta il $nonce.

Il primo argomento è il nonce e proviene dalla richiesta

Infatti, wp_verify_nonce() deve essere usato in questo modo:

// qui assumo che il form venga inviato usando il metodo 'post'

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

Quindi il primo argomento passato a wp_verify_nonce() è esattamente il valore presente nel campo hidden.

Secondo argomento: il metodo wp_create_nonce()

Per quanto riguarda il secondo argomento, dipende da come hai costruito il valore del nonce.

Ad esempio, se hai fatto:

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

Allora devi fare:

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

Quindi, il secondo argomento è ciò che è stato usato come argomento per wp_create_nonce().

Secondo argomento: il metodo wp_nonce_field()

Se hai creato il nonce usando wp_nonce_field() così:

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

Allora devi verificare il nonce in questo modo:

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

Quindi, questa volta, l'azione è qualunque cosa sia stata passata come primo argomento a wp_nonce_field().

Riepilogo

Per superare la validazione di wp_verify_nonce() devi passare 2 argomenti alla funzione: uno è il valore nel campo hidden del nonce, l'altro è l'azione, e dipende da come è stato costruito il valore del nonce.

12 lug 2015 20:58:29
Commenti

@birgire Faccio errori di battitura come un professionista :)

gmazzap gmazzap
12 lug 2015 21:06:22

Almeno ci sono alcuni editor inglesi professionisti sul sito che ci aiutano a noi non madrelingua a pulire i nostri errori di battitura, lol ;-). Grande spiegazione comunque, +1

Pieter Goosen Pieter Goosen
12 lug 2015 21:20:56