check_admin_referer() は、WordPressでフォームやリンクからのリクエストが正当な管理画面操作かどうかを検証するための関数です。
CSRF(クロスサイトリクエストフォージェリ)対策として使用され、セキュアなデータ送信や操作を行いたいときに不可欠な仕組みです。wp_nonce_field() や wp_nonce_url() で生成したnonceを検証するのが主な役割です。
目次
基本構文
check_admin_referer( string $action = -1, string $query_arg = '_wpnonce' );この関数は、管理画面のフォームなどで送信された _wpnonce の値が、事前に指定された $action と一致するかどうかを検証します。不一致の場合は wp_die() を実行し、処理を中断します。
引き数と戻り値
| 引数 | 型 | 説明 |
|---|---|---|
$action | string | nonce の生成時に使用したアクション名。デフォルトは -1。 |
$query_arg | string | 検証対象のクエリ引数名(通常は _wpnonce)。 |
| 戻り値 | 型 | 説明 |
|---|---|---|
true | bool | 不一致の場合は wp_die() により終了されるため、false は返しません。 |
使用例
タグを使った使用例
フォームにnonceを付加し、チェックする流れ:
フォームの表示部分(例:管理画面)
<form method="post" action="">
<?php wp_nonce_field('my_custom_action', 'my_custom_nonce'); ?>
<input type="submit" value="送信">
</form>送信されたデータの処理部分
if ( isset($_POST['my_custom_nonce']) ) {
check_admin_referer('my_custom_action', 'my_custom_nonce');
// 安全な処理
}wp_nonce_field()で nonce を生成し、フォームに埋め込むcheck_admin_referer()で、その nonce の有効性とアクションの整合性を確認
注意点
check_admin_referer()を使うことで、CSRF攻撃を防止できますが、nonce自体は完全な認証情報ではなく、「今ログイン中のユーザーがこの操作を意図して行ったか」を確認する目印にすぎません。- 非ログインユーザー向けのフロントエンドでは
check_ajax_referer()などの関数の方が適しています。
良く一緒に使われる関数
wp_nonce_field()
wp_nonce_field('my_action', 'my_nonce_name');この関数で生成した nonce を check_admin_referer() で検証します。
一緒に使うコード例
<form method="post">
<?php wp_nonce_field('delete_item', 'delete_item_nonce'); ?>
<button type="submit">削除</button>
</form>
<?php
if ( isset($_POST['delete_item_nonce']) ) {
check_admin_referer('delete_item', 'delete_item_nonce');
// 削除処理
}
?>想定されるトラブル
この操作は許可されていません。”というエラーが出る
解決方法
- nonceが期限切れ(デフォルトで24時間)になっている可能性があります。ページをリロードしてフォームを再送信してください。
wp_nonce_field()で指定したアクション名と、check_admin_referer()のアクション名が一致しているか確認してください。- フォームに
method="post"が指定されていない、もしくは$_POSTではなく$_GETになっている場合は、意図通りに動作しないことがあります。
Q&A
まとめ
check_admin_referer() は WordPress のセキュリティを担保する重要な関数の一つで、CSRF対策に有効です。
主に wp_nonce_field() とセットで使い、管理画面内でのフォーム送信やリンク操作の正当性を検証します。
正しい使い方と理解をもって導入すれば、セキュアなカスタマイズが可能になります。
コメント