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
)。
引き数と戻り値
スクロールできます
引数 | 型 | 説明 |
---|---|---|
$action | string | nonceを生成した時に使ったアクション名。 |
$query_arg | string | false` |
$die | bool | 検証失敗時に wp_die() を呼ぶかどうか(デフォルト:true )。 |
スクロールできます
1 | int | nonce が有効で、生成から 0〜12 時間以内の場合に返されます。 |
---|---|---|
2 | int | nonce が有効で、生成から 12〜24 時間以内の場合に返されます。 |
false | bool | nonce が無効な場合に返されます(ただし $stop が false のとき)。 |
-1 | 終了コード | $stop が true (デフォルト)で 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_ajax_referer()
は、WordPressのAjax通信において、リクエストの正当性を保証するための重要なセキュリティ関数です。
CSRF対策として欠かせない存在であり、wp_create_nonce()
とセットで使用されます。Ajax処理を扱うときは必ず導入し、安全性を確保しましょう。
コメント