Come funziona la verifica nonce?


14

Vedo che wp_nonce_field genera un valore nel campo nascosto.

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

Ma wp_verify_nonce non sta usando quel valore per quanto posso dire, ma potrei sbagliarmi.

Sembra che stia usando 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 è il punto di avere un attributo value nel campo nascosto?


1
Hai anche il $noncevalore lì - il controllo restituisce false se il $noncevalore è mancante.
birgire,

Sì, l'ho visto, ma controlla solo se non è vuoto, quindi potrebbe essere qualsiasi cosa
ed-ta

abbiamo anche ottenuto il $noncevalore in questo confronto:hash_equals( $expected, $nonce )
birgire,

È vero. Mi stavo concentrando sul valore.
ed-ta,

Risposte:


15

TL; DR

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

wp_verify_nonce() argomenti

wp_verify_nonce() riceve 2 argomenti:

  1. $nonce
  2. $action

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

Il primo argomento è il nonce e proviene dalla richiesta

In effetti, wp_verify_nonce()devono essere usati in questo modo:

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

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

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

2 ° argomento: il wp_create_nonce()metodo

Per quanto riguarda il secondo argomento, dipende da come si costruisce il valore nonce.

Ad esempio se hai fatto:

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

Quindi devi fare:

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

Quindi, il secondo argomento è quello a cui è stato utilizzato come argomento wp_create_nonce().

2 ° argomento: il wp_nonce_field()metodo

Se hai creato il nonce usando wp_nonce_field()like:

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

Quindi è necessario verificare il nonce in questo modo:

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

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

Ricapitolare

Per passare la wp_verify_nonce()convalida è necessario passare 2 argomenti alla funzione, uno è il valore nel campo nascosto nonce, l'altro è l' azione e dipende da come è stato creato il valore nonce.


4
@birgire Faccio refuso come un professionista :)
gmazzap

2
Almeno ci sono alcuni editor inglesi professionisti sul sito per aiutarci a scrivere in inglese non nativi i nostri errori di battitura, lol ;-). Grande spiegazione A proposito, +1
Pieter Goosen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.