ajax - por que várias chamadas para wp_create_nonce () retornam o mesmo valor?

4

Tenho alguns problemas para fazer com que as nonces trabalhem com meu formulário de envio de ajax.

Primeiro, eu crio um nonce e o passo para o meu script registrado, depois o envio para o ajax-handler com meus campos de formulário:

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

No meu manipulador de respostas ajax eu verifico o nonce, faço minhas coisas e tento criar um novo nonce para enviar de volta para o js, para depois enviar:

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

... mas, de volta ao meu js, o novo nonce é exatamente o mesmo que o antigo! Como o nonce deve mudar com o tempo, por que uma segunda chamada para wp_create_nonce retorna a mesma string?

    
por Gabriele B 14.04.2011 / 16:25

1 resposta

6

Por padrão, o tempo de vida de um nonce é de um dia. O nonce é gerado pela concatenação de uma variável representando o dia atual, o ID do usuário e o nome da ação, e hashing a string resultante.

Se você deseja que o valor de nonce seja alterado com mais frequência, é possível filtrar o valor de 'nonce_life'. Esta função, por exemplo, forçará as moedas a mudar a cada hora:

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

Mas isso também não parece exatamente com o que você está tentando fazer. Você pode ter mais sorte em gerar o tipo de atividade única que você deseja usando um nome diferente para o valor "ação" do nonce, que será verdadeiramente exclusivo para a ação específica que você está tentando executar. Parece que você está usando "nonce-roll" como o nome da ação para algumas ações distintas que deseja verificar separadamente. Talvez você possa usar um nome de ação mais específico para cada ação que está tentando realizar e autorizar.

    
por goldenapples 14.04.2011 / 19:43

Tags