ajax - pourquoi plusieurs appels à wp_create_nonce () renvoient la même valeur?

4

J'ai quelques difficultés à faire fonctionner des nonces avec mon formulaire de soumission ajax.

Tout d'abord, je crée un nonce et le passe à mon script enregistré. Je l'enverrai plus tard à ajax-handler qui contient tous les champs de mon formulaire:

wp_localize_script( 'roll_script', 'Roll', array(
                    'postRollNonce' => wp_create_nonce('nonce-roll')));

Dans mon gestionnaire d'ajax-response, je vérifie le nonce, je fais mes affaires et essaie de créer un nouveau nonce à renvoyer à js, pour un envoi ultérieur:

        function on_ajax_roll(){
            if (!wp_verify_nonce($_POST['postRollNonce'], 'nonce-roll' )) die ('No allowed!');
// nonce is valid! do some stuff...     
            $r = array('postRollNonce' => wp_create_nonce('nonce-roll'));           
            $response = json_encode($r);
            header( "Content-Type: application/json" );
            echo $response;
            die();
    }

... mais revenons à ma question, le nouveau nonce est exactement le même que l'ancien! Puisque le nonce est censé changer avec le temps, pourquoi un second appel à wp_create_nonce renvoie la même chaîne?

    
posée Gabriele B 14.04.2011 - 16:25

1 réponse

6

Par défaut, la durée de vie d'un nonce est d'un jour. Le nonce est généré en concaténant une variable représentant le jour actuel, l'identifiant de l'utilisateur et le nom de l'action, puis en hachant la chaîne résultante.

Si vous souhaitez que la valeur de nonce change plus fréquemment, vous pouvez filtrer la valeur 'nonce_life'. Cette fonction, par exemple, forcera les nonces à changer toutes les heures:

function nonce_hourly() {
    return 3600;
    }
add_filter( 'nonce_life', 'nonce_hourly' );

Mais cela ne sonne pas exactement comme ce que vous essayez de faire. Vous aurez peut-être plus de chance de générer le type de non-ponctuel de votre choix en utilisant un nom différent pour la valeur "action" du nonce, qui sera vraiment unique pour l'action spécifique que vous essayez d'effectuer. Il semble que vous utilisiez "non-roll" comme nom d'action pour certaines actions que vous souhaitez pouvoir vérifier séparément. Peut-être pouvez-vous utiliser un nom d'action plus spécifique pour chaque action que vous essayez d'exécuter et autoriser.

    
réponse donnée goldenapples 14.04.2011 - 19:43

Lire d'autres questions sur les étiquettes