WordPress: Ajaxでセキュアな通信を行う

  • -

    シェア
  • ---

    LINEで送る
  • -

    はてなブックマーク
    ブックマーク
  • -

    pocket
  • -

    rss
他言語サイト
us us
wordpress image

WordPressのAjaxでセキュアな通信を行う方法を、サンプルコードを使って説明します。

nonceを使うことで簡単に実装することができます。

nonceとは何か?

nonceとは使い捨てのランダムな値のことです。これを使ってサーバが正当なhttp/httpsリクエストを受信したことを確認します。

WordPressではこのnonceをワンタイムパスワードのような形で利用します。実際は、nonce値は有効期間を持っていて、有効期間を過ぎたらランダムな値が変更される仕組みになっています。有効期間のデフォルト値は1日です。

くわしくはWordPressのサイトにあります。

実装方法は簡単です。実際どのようにするのか見てみましょう。

サンプルコードは、「WordPressの管理画面(プラグイン)でAjaxを使う」を元に進めます。WordPressでのAjaxの実装方法が分からない人は、一度参照することをおすすめします。

JavaScriptのコーディング

jsファイルのキュー登録

wp_localize_script()のパラメータに、生成したnonceのランダムな値を追加します。

$ajax = [
    'ajax_url' => admin_url('admin-ajax.php'),
    'check_nonce' => wp_create_nonce('ajax-nonce')
];
wp_localize_script('js_handle_name', 'localize', $ajax);

jsファイルの内容

次に、http/httpsリクエストでnonceの値を送信するように、jsファイルの内容に追加します。

function clearCacheSnsCount() {
    jQuery.ajax({
        type: "POST",
        url: localize.ajax_url,
        dataType: 'text',
        data: {
            action: 'clear_cache',
            check_nonce: localize.check_nonce
        }
    }).done(function(data, textStatus, jqXHR) {
        outputMsg(data);
    }).fail(function() {
        outputMsg('cache clear error!!');
    });
}

check_nonceというクエリにnonceの値を付けて、http/httpsリクエストを送信します。

サーバの処理(phpのコーディング)

次の関数がajaxで送信したリクエストを受信したときの処理になります。

function clear_cache() {
    $cache_file = '../cache/11111111111111111.cache';
    $success = __('Complete clear cache');
    $error = __('Clear cache failer');
    $result = '';

    if ( ! check_ajax_referer( 'clear_cache', 'check_nonce', false ) ) {
        echo $error;
        die();
    }

    if ( ! check_admin_referer( 'clear_cache', 'check_nonce' ) ) {
        echo $error;
        die();
    }

    if(file_exists($cache_file)) {
        if(unlink($cache_file)) {
            $result = $success;
        } else {
            $result = $error;
        }
    } else {
        $result = $success;
    }
    echo $result;
    die();
}
add_action('wp_ajax_clear_cache', 'clear_cache');

check_ajax_referer()はAjax通信用のnonce値の確認を行います。内容が一致しない場合はfalseが返ってきます。

check_admin_referer()は管理画面用のnonce値の確認を行います。WordPressの管理画面でAjaxを実装するときに使います。

ログイン認証されてない場合はfalseが返ってきます。

パラメータには、Ajax通信で指定したactionの値と、nonceを格納したクエリ変数名を指定します。

また、通常のhttp/httpsリクエスト用にwp_verify_nonce()という関数も用意されています。

nonceだけで大丈夫か?

WordPressのnonceは有効期間を持っているので、正確にはワンタイムパスワードではなく、セキュアではないとも言えます。しかし、有効期間の設定の変更は可能です。

例えば、有効期間を4時間に変更する場合は、functions.phpなどに次のように定義します。

add_filter( 'nonce_life', function () { return 4 * HOUR_IN_SECONDS; } );

有効期間を可能な限り短くすることで、ワンタイムパスワードに近いセキュリティが実現できます。

それでも、これだけで大丈夫?と思うかもしれません。

今、セキュアなWordpress運用と仕組みについてまとめ中です。ご紹介できるようになったら、随時公開していきます。

 

最近Webカテゴリでよく読まれている記事です。
post-cta-image
blog image

ドメイン取得の意味が分からない人へ。王道の方法を紹介します。

ドメインの登録業者を選ぶのに悩む必要はないです。サイトを簡単に早く公開するには全くいらないことで、むしろ邪魔です。『お名前.com』というサービスは必ず耳にします。そのお名前.comのメリットとデメリットと一緒に、ドメインの意味が分からない人が一番失敗しないドメインの取得方法を紹介します。

tadtadya.com

_

SNSでも記事を配信しています。
コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

この記事を気に入ったらぜひシェアも!!