Comment fonctionne la vérification nonce?

14

Je peux voir que wp_nonce_field génère une valeur dans le champ caché.

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

Mais wp_verify_nonce n'utilise pas cette valeur pour autant que je sache, mais je peux me tromper.

Il semble qu'il utilise un jeton de session pour la vérification.

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

Quel est alors l'intérêt d'avoir un attribut de valeur dans le champ caché?

ed-ta
la source
1
Vous avez également la $noncevaleur - le chèque renvoie faux si la $noncevaleur est manquante.
birgire
Oui, je l'ai vu, mais il vérifie uniquement s'il n'est pas vide afin qu'il puisse s'agir de quelque chose
ed-ta
nous avons également obtenu la $noncevaleur dans cette comparaison:hash_equals( $expected, $nonce )
birgire
C'est vrai. Je me concentrais sur la valeur.
ed-ta

Réponses:

15

TL; DR

En bref, wp_verify_nonce() utilise cette valeur car il attend cette valeur comme premier argument.

wp_verify_nonce() arguments

wp_verify_nonce() reçoit 2 arguments:

  1. $nonce
  2. $action

La valeur dans le champ caché ( 'cabfd9e42d'dans votre exemple) représente le $nonce.

Le premier argument est le nonce, et vient de la requête

En fait, wp_verify_nonce()doivent être utilisés comme suit:

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

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

Ainsi, le premier argument transmis à wp_verify_nonce()est exactement la valeur présente dans le champ caché.

2ème argument: la wp_create_nonce()méthode

En ce qui concerne le deuxième argument, cela dépend de la façon dont vous créez la valeur nonce.

Par exemple, si vous l'avez fait:

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

Ensuite, vous devez faire:

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

Donc, le deuxième argument est celui qui a été utilisé comme argument wp_create_nonce().

2ème argument: la wp_nonce_field()méthode

Si vous avez créé le nonce en utilisant wp_nonce_field()comme:

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

Ensuite, vous devez vérifier le nonce comme suit:

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

Donc, cette fois, l'action est celle qui est passée en premier argument wp_nonce_field().

résumer

Pour passer la wp_verify_nonce()validation, vous devez passer 2 arguments à la fonction, l'un est la valeur dans le champ caché nonce, l'autre est l' action , et dépend de la façon dont la valeur nonce a été construite.

gmazzap
la source
4
@birgire Je fais une faute de frappe comme un pro :)
gmazzap
2
Au moins, il y a des éditeurs professionnels en anglais sur le site pour nous aider à taper des anglais non natifs pour nettoyer nos fautes de frappe, lol ;-). Grande explication BTW, +1
Pieter Goosen