web-dev-qa-db-ja.com

ajax - wp_create_nonce()への複数の呼び出しが同じ値を返すのはなぜですか?

私のajax送信フォームでnonceがうまく動かないようにするのに私はいくらか問題があります。

まず最初にnonceを作成し、それを登録済みスクリプトに渡します。後でそれをフォームフィールドが詰め込まれたajaxハンドラーに送信します。

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

私のajax-responseハンドラーで、私はナンスを確認し、私のものをし、後で提出するために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への2回目の呼び出しで同じ文字列が返されるのはなぜですか?

4
Gabriele B

デフォルトでは、一回だけの有効期間は1日です。ナンスは、当日を表す変数、ユーザーID、およびアクションの名前を連結し、結果の文字列をハッシュすることによって生成されます。

Nonce値をより頻繁に変更したい場合は、 'nonce_life'値をフィルタリングすることができます。たとえば、この関数は1時間ごとにナンスを強制的に変更します。

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

しかし、これはあなたがやろうとしていることと全く同じようには聞こえません。 nonceの "action"値に異なる名前を使用することで、あなたが欲しい種類の使い捨てnonceを生成することができれば幸いです。個別に確認したいいくつかの異なるアクションのアクション名として "nonce-roll"を使用しているように見えます。承認します。

7
goldenapples