web-dev-qa-db-fra.com

Nonce Il y a 0-12 heures

Dans WordPress, il existe un mécanisme de non-génération de génération/vérification, et j'ai du mal à comprendre pourquoi il ne fonctionne pas correctement ...

À un moment donné, il vérifie si le nonce a été généré il y a 0 à 12 heures.

wp-includes\pluggable.php: 1260

function wp_verify_nonce($nonce, $action = -1) {
    $user = wp_get_current_user();
    $uid = (int) $user->ID;
    if ( ! $uid )
        $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );

    $i = wp_nonce_tick();

    // Nonce generated 0-12 hours ago 
    if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce )
        return 1;
    // Nonce generated 12-24 hours ago
    if ( substr(wp_hash(($i - 1) . $action . $uid, 'nonce'), -12, 10) == $nonce )
        return 2;
    // Invalid nonce

    return false;
}

Comment ça fonctionne if?

// Nonce generated 0-12 hours ago 
if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce )

Je vois que wp_hash($i . $action . $uid, 'nonce') = 8ae70558afac4a6951e3bc0f9ef1f59a
et $nonce = 3551. Comment est-ce que $nonce est comparé à -12,10ème partie de 8ae70558afac4a6951e3bc0f9ef1f59a est supposé être un chèque pour "0-12 hours ago"?

1
laggingreflex

Les mots de WordPress ne sont pas votre mot de passe habituel ("n'utilisez qu'une seule fois"). Pour un $action donné, un nouveau nonce est généré toutes les 12 heures et les nonces sont valables pendant 24 heures. Il existe donc deux nonces valides pour un $action donné.

Le nonce est (une sous-chaîne de) un hachage de

  • $action - l'action
  • $uid - l'ID utilisateur
  • $i - incrémenteur.

Les incréments augmentent de 1 toutes les 12 heures, donc si le nonce actuel pour un utilisateur et une action donnés est une sous-chaîne de

wp_hash($i . $action . $uid, 'nonce')

Alors le nonce précédent (pour le même utilisateur et action) est une sous-chaîne de

wp_hash(($i - 1) . $action . $uid, 'nonce')

Comme les deux sont des notes valides, lorsque vous vérifiez votre $nonce reçu, vous recherchez une correspondance.

3
Stephen Harris

Je voudrais apporter une explication plus détaillée sur comment fonctionnent réellement les WordPress NONCE . En outre, la réponse acceptée doit être mise à jour avec des informations plus précises, car désormais WordPress prend également en compte le jeton de session lors de la création du nonce. Le lien est un long article que j'ai écrit avec des explications plus détaillées.

Premièrement, la réponse acceptée ne dit pas comment fonctionne la variable if.

alors disséquons-nous? Notez que j'utilise la version actuelle de l'instruction car elle prend désormais en compte le jeton de session de l'utilisateur.

$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );

la fonction PHP substr() renvoie une partie de la chaîne.

Ici, l'évaluation de wp_hash() est la chaîne que substr() va évaluer et renvoyer une partie de. l'argument -12 dit qu'il faut compter 12 caractères à partir de la fin de la chaîne (résultat de l'évaluation de wp_hash()), substr commence à la fin à cause du signe moins qui l'indique.

Enfin, le dernier argument 10 dit de renvoyer 10 caractères sous la chaîne .

Comptez donc 12 caractères à partir de la fin, puis renvoyez 10, de sorte que les 2 derniers caractères soient supprimés du résultat renvoyé.

Si vous vérifiez un WordPress NONCE, il contient exactement 10 caractères.

Un autre point que je voudrais préciser est la durée de vie d'un WP NONCE.

Nous ne devrions pas dire qu'un nonce est valide pendant 24 heures, car en réalité, il est toujours inférieur . Un NONCE est valable 24 heures maximum et 12 heures minimum. Mieux dit, il est valable pour 2 ticks.

Comme @Stephen Harris l'a expliqué, un tick est un incrément de la durée de vie actuelle du NONCE.

Et par défaut, une coche représente 12 heures à partir de l'heure UTC. Ainsi, à minuit +1 seconde et à midi +1 seconde, la valeur du tick est incrémentée de 1 unité.

Étant donné que le $token reste le même (l'utilisateur ne s'est pas déconnecté et n'est pas revenu), alors wp_hash() renverra toujours le même hachage pour une action et un ID utilisateur donnés.

Cela restera vrai jusqu'à ce que la valeur de tick actuelle soit incrémentée de 1. Dans ce cas, le hachage sera différent pour la même action, le même identifiant d'utilisateur et le même token.

C’est ainsi que WordPress considère comme valide un nonce créé il y a 0-12 heures .

WordPress considère également valide un nonce créé il y a 12-24 heures en comparant le nonce à la fonction de hachage en utilisant la valeur de tick précédente. Mais c'est trompeur comme je l'ai déjà mentionné. La période d'il y a 12 à 24 heures ne fait pas référence à l'heure de création explicite réelle d'un NONCE donné (autrement dit, c'est que vous n'utilisez pas l'horodatage de la création de nonce) indique plutôt dans la période comprise entre 12 et 24 depuis sa création . Ce qui correspond en fait à une valeur de tick unique (1 moins que l'actuel)

Il serait moins déroutant de considérer la non-validité en termes de ticks et non en heures.

Donc, la meilleure façon de décrire la validité serait

  • 0-12 heures == valeur actuelle du tick == t
  • 12-24 heures == valeur actuelle du tick - 1 == valeur du tick précédent == t - 1

J'espère avoir rendu les choses plus claires

1
bynicolas