аякс - почему несколько вызовов wp create nonce() возвращают одно и то же значение?


У меня некоторые проблемы с тем, чтобы не работать с моей формой отправки ajax.

Сначала я создаю nonce и передаю его в свой зарегистрированный скрипт, позже я отправлю его в ajax-обработчик, упакованный с моими полями формы:

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

В моем обработчике ajax-ответа я проверяю nonce, делаю свое дело и пытаюсь создать новый nonce для отправки обратно в js, для последующей отправки:

        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();
    }

...но, возвращаясь к моему js, новый nonce точно такой же, как и старый! Так как предполагается, что nonce чтобы измениться со временем, почему второй вызов wp_create_nonce возвращает ту же строку?

 4
Author: Gabriele B, 2011-04-14

1 answers

По умолчанию срок службы nonce составляет один день. Nonce генерируется путем объединения переменной, представляющей текущий день, идентификатор пользователя и имя действия, и хэширования результирующей строки.

Если вы хотите, чтобы значение nonce менялось чаще, вы можете отфильтровать значение "none_life". Эта функция, например, заставит nonces меняться каждый час:

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

Но это тоже не совсем похоже на то, что вы пытаетесь сделать. У вас может быть лучше удачи в создании одноразовых одноразовых сообщений, которые вы хотите, используя другое имя для значения "действие", которое будет действительно уникальным для конкретного действия, которое вы пытаетесь выполнить. Похоже, что вы используете "nonce-roll" в качестве имени действия для некоторых отдельных действий, которые вы хотите иметь возможность проверять отдельно - возможно, вы можете использовать более конкретное имя действия для каждого действия, которое вы пытаетесь выполнить и авторизовать.

 7
Author: goldenapples, 2011-04-14 17:43:07