MENU

check_ajax_referer()

check_ajax_referer() は、WordPressのAjax通信時に送信されたリクエストが正当なものであるかを確認するための関数です。

主に JavaScript から admin-ajax.php にリクエストを送るとき、nonce(ワンタイムトークン)を検証することで、CSRF(クロスサイトリクエストフォージェリ)を防止します。非同期処理でのセキュリティ強化に不可欠な関数です。

目次

基本構文

check_ajax_referer( string $action = -1, string $query_arg = false, bool $die = true );

この関数は、POST/GETリクエスト内に含まれる nonce 値を検証し、正当性がない場合は処理を中断します。

  • $action: nonce生成時の識別子。wp_create_nonce() などで使用したものと一致させる。
  • $query_arg: nonceのキー名。省略すると _ajax_nonce または nonce を自動検出。
  • $die: チェックに失敗した際に wp_die() を実行するか(true)否か(false)。

引き数と戻り値

スクロールできます
引数説明
$actionstringnonceを生成した時に使ったアクション名。
$query_argstringfalse`
$diebool検証失敗時に wp_die() を呼ぶかどうか(デフォルト:true)。
スクロールできます
1intnonce が有効で、生成から 0〜12 時間以内の場合に返されます。
2intnonce が有効で、生成から 12〜24 時間以内の場合に返されます。
falseboolnonce が無効な場合に返されます(ただし $stopfalse のとき)。
-1終了コード$stoptrue(デフォルト)で nonce が無効な場合、スクリプトが -1 を出力して終了します。

使用例

タグを使った使用例

JavaScriptからAjaxリクエストを送信し、PHPで検証する

JavaScript側
jQuery.ajax({
  url: ajaxurl,
  type: 'POST',
  data: {
    action: 'my_ajax_action',
    _ajax_nonce: my_ajax_object.nonce
  },
  success: function(response) {
    console.log(response);
  }
});
PHP側
add_action('wp_ajax_my_ajax_action', 'my_ajax_callback');
function my_ajax_callback() {
    check_ajax_referer('my_action', '_ajax_nonce');
    
    // 検証成功後の処理
    echo 'Success!';
    wp_die(); // Ajaxでは終了に wp_die() を使う
}
Nonce発行(PHP側でJavaScriptに渡す)
wp_localize_script('my-script-handle', 'my_ajax_object', array(
  'nonce' => wp_create_nonce('my_action'),
  'ajaxurl' => admin_url('admin-ajax.php')
));

注意点

  • nonceは期限付き(デフォルト24時間)であり、期限切れになると検証に失敗します。
  • JavaScript側では、wp_localize_script() を使って nonce を安全に渡すことが推奨されます。
  • nonceは認証ではなく、「意図したユーザー操作か」を検証するものです。

良く一緒に使われる関数

wp_create_nonce()

Nonceを生成する関数。check_ajax_referer() で同じ $action を指定する必要があります。

$nonce = wp_create_nonce('my_action');

// JavaScriptに渡す
wp_localize_script('my-script', 'my_ajax', array(
  'nonce' => wp_create_nonce('my_action')
));

想定されるトラブル

-1 が返ってきて処理が止まる

解決方法

check_ajax_referer('my_action', 'custom_nonce_name');
  • Nonceが一致していない可能性があります。
  • JavaScriptで送信しているnonceの名前が _ajax_nonce でない場合、$query_arg を明示的に指定してください。

期限切れで「権限がありません」エラー

解決方法

add_filter('nonce_life', function() {
  return 12 * HOUR_IN_SECONDS;
});
  • Nonceは24時間の有効期限があるため、定期的にページを更新して新しいnonceを取得する必要があります。
  • 必要に応じて、nonce_life フィルターで有効期限を延長できます。

Q&A

check_admin_referer() と何が違う?

check_admin_referer() は主に管理画面内のフォーム用。check_ajax_referer() はAjax通信専用で、非同期リクエストに適しています。

非ログインユーザーでも使える?

wp_ajax_nopriv_アクション名 を使うことで、未ログインユーザーでもAjaxリクエスト可能です。

nonceをJavaScriptに安全に渡すには?

wp_localize_script() を使ってスクリプトに変数として渡すのが推奨されています。

まとめ

check_ajax_referer() は、WordPressのAjax通信において、リクエストの正当性を保証するための重要なセキュリティ関数です。

CSRF対策として欠かせない存在であり、wp_create_nonce() とセットで使用されます。Ajax処理を扱うときは必ず導入し、安全性を確保しましょう。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

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

目次