web-dev-qa-db-ja.com

Wordpress(4.x)セッションとnonceを拡張する

セキュリティ上の目的で、ユーザーが(WordPress経由で)ログインし、最大15分のセッションでログインしたままでいることを可能にする小さなWebアプリケーションがあります。ほとんどのセッションは長持ちするため、HTML文書自体をクリックするたびに小さなAjax呼び出しが行われます。

Ajax呼び出し自体が/admin-ajax.phpファイルを起動し、(functions.php内の)関数にヒットします。以下がその機能です。

function extend_my_session_yo(){
    $user_id = get_current_user_id();
    wp_set_auth_cookie($user_id, false, true);

    $new_logout = wp_logout_url();

    if ( is_user_logged_in() ) {
        echo 'session extended 15 mins ' . $new_logout;
    } 
    // if a user is *not* logged in, Wordpress just outputs a "0". 
    die();
}

wp_set_auth_cookie()は大変な仕事をします。それは正しく(各クリックで)15分間の延長セッションを可能にします。問題は、誰かがログアウトしようとした場合です。現在のログアウトリンクはwp_logout_url()を介してエコー表示されますが、そのログアウトURLはWordPressによって作成された瞬間から一瞬しかありません。

それで、上記の関数で、私は新しいログアウトURLを生成しています(そしてWPコアコードから、これは新しいクッキーからセッショントークンを取得することによって生成されるようです)、しかしlogout urlは、Wordpress Failure Noticeページにnonceの不一致を示します。私は今までも$expected$noncewp_verify_nonce()関数をチェックするために(hash_equals()のために)pluggable.phpからコードをコピーすることさえしました、そしてそれらは同等です。まだ私はまだ一回限りのエラーが出ます。

誰もがこれらのエラーを回避するために新しい一回だけを設定しながら、新しいauth/logging_inクッキーを設定する方法を知っていますか?

6
MikeTT

あなたの問題は、あなたがwp_logout_urlの直後にwp_set_auth_cookieを呼び出すことです。

wp_set_auth_cookie()はいくつかのsetcookie()呼び出しを行います。残念ながら、setcookieはPHP global $_COOKIEで新しい値を即座に利用可能にしません。最初に新しいHTTPリクエストを通じて設定する必要があります。

wp_logout_url()wp_nonce_url> wp_create_nonce> wp_get_session_token> wp_parse_auth_cookieによる)は有効な一回だけを作成するために$_COOKIE[LOGGED_IN_COOKIE]を取り出します。ログインしたクッキーが既に更新されていることを知らないで。 (これをWPコアバグと呼ぶことができるかどうかはよくわかりません。)

wp_set_auth_cookieにはset_logged_in_cookieという名前のアクションフックがあります。これにより、ajaxリクエスト中にセッションクッキーの値を更新できるようになります。

function my_update_cookie( $logged_in_cookie ){
    $_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
}
add_action( 'set_logged_in_cookie', 'my_update_cookie' );
5
Jörn Lund