wp_verify_nonce vs check_admin_referer

21

Quelle est la différence, laquelle dois-je utiliser?

Je sais que wp_verify_nonce vérifie la limite de temps, et check_admin_referer, je pense, appelle wp_verify_nonce ainsi que la vérification d'un segment d'URL administrateur, mais je suis un peu confus sur celui que je dois utiliser et quand.

Merci pour la clarté.

Jeff
la source
1
Badge Tumbleweed pour cette question? Vraiment? N'importe qui?
Jeff

Réponses:

29

Je pensais que check_admin_referervérifié le nonce (il fait appel wp_verify_nonce, et l'URL de référence Après avoir creusé dans le code de base , j'ai réalisé qu'il n'a pas agi Pensant qu'il était un bug je l' ai signalé, et Ryan Boren répondu à ce qui suit..:

En fait, si le nonce est valide, le référent ne doit pas être vérifié. Le manque de fiabilité des référents est l'une des raisons pour lesquelles les nonces sont utilisés. Les nonces remplacent entièrement la vérification du référent. La seule fois où nous vérifions le référent est lors du traitement de la condition de compatibilité descendante -1. -1 signifie que quelqu'un n'utilise pas de nonces, nous revenons donc à la vérification des référents. Cette utilisation est désormais très rare. check_admin_referer () est mal nommé maintenant qu'il ne fait presque jamais de vérification de référent. Il serait préférable de nommer quelque chose comme check_nonce (), mais nous le gardons tel quel pour la compatibilité avec le passé et le bon vieux temps.

Il n'y a donc en fait aucune différence.

Stephen Harris
la source
Beau travail de fouille, merci, qui apporte une certaine clarté.
Jeff
5
Il y a en fait une grande différence qui affecte l'utilisation ... check_admin_referer tue le script entier avec die () si le nonce n'est pas valide, tandis que wp_verify_nonce renvoie false. Donc, s'il y a certaines circonstances normales dans lesquelles le nonce échouera, utilisez wp_verify_nonce pour que le reste du script s'exécute toujours.
SeventhSteel
@SeventhSteel - vous avez bien sûr raison. Mon interprétation de la question était que la logique de vérification des nonces était comparée plutôt que ce qui se passe quand son invalide
Stephen Harris
3

NON!!!

Ne comptez pas sur check_admin_referer, soyez prudent!

  • Il wp_verify_nonene comprend que dans le cas où a _wpnonceété défini !!!
  • Dans ce cas, ce n'est pas le cas DIE(). Au lieu de cela, il renvoie faux ...

Regardez ce phseudo-code ( la source complète est ici ):

function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
    .....
    $result = isset($_REQUEST[$query_arg]) ? wp_verify_nonce($_REQUEST[$query_arg], $action) : false;
    do_action( 'check_admin_referer', $action, $result );
    if ( ! $result && ! ( -1 == $action && strpos( $referer, $adminurl ) === 0 ) ) {
        die(...);
    }
    return $result;
}
T.Todua
la source