wp_nonce_field() の使い方|説明・引数・注意点

説明

wp_nonce_field() は、フォームにnonceの隠しフィールドを出力する関数です。

基本構文

wp_nonce_field( string|int $action = -1, string $name = '_wpnonce', bool $referer = true, bool $display = true ): string

引数

  • $action:処理を識別する文字列
  • $name:フィールド名
  • $referer:リファラーのフィールドも出力するか
  • $display:出力するか(true で出力。戻り値は常にHTML文字列)

戻り値

nonceの隠しフィールドのHTML文字列を返します。$display が true(既定)のときは、同じ文字列を出力もします。

使い方(サンプル)

wp_nonce_field( 'my_action', 'my_nonce' );

注意点

  • フォーム内に出力し、受け取る側で wp_verify_nonce() を使って検証します。

実務での使いどころ

  • 管理画面の独自フォームや、メタボックスの保存処理で、CSRF対策を行うとき。
  • フロントのPOSTフォームに、不正な送信を防ぐ確認を入れるとき。
  • save_post フックで、メタボックスの値を保存する前の確認。

よくあるミスと対処

  • フォームに出力するだけで、受け取る側で検証していない。検証しなければ意味がありません。
  • 出力側と検証側で、アクション名(第1引数)やフィールド名(第2引数)が違っている。
  • nonceが、権限チェックの代わりになると考えている。nonceは「そのフォームから送られた」ことの確認で、権限の確認ではありません。current_user_can() も併用します。
  • ページキャッシュされるページにnonceを出力し、期限切れで検証に失敗する。nonceには有効期限があります(12〜24時間)。

NG例

// フォーム側にnonceを出力しているだけで、受け取り側で何も確認していない
wp_nonce_field( 'my_action', 'my_nonce' );

OK例

// フォーム側
wp_nonce_field( 'my_action', 'my_nonce' );

// 受け取り側
if ( ! isset( $_POST['my_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['my_nonce'] ) ), 'my_action' ) ) {
	return;
}

使い分け早見表

場面 使うもの
フォームの中に、hiddenで出力する wp_nonce_field()
リンクのURLに付ける wp_nonce_url()
JavaScriptに渡す値を作る wp_create_nonce()
検証する(戻り値で判定) wp_verify_nonce()
検証する(管理画面。失敗時は処理を止める) check_admin_referer()
検証する(Ajax) check_ajax_referer()

関連項目

wp_create_nonce()、wp_verify_nonce()、wp_nonce_url()、check_admin_referer()、check_ajax_referer()

公式リファレンス:wp_nonce_field() | Function | WordPress Developer Resources

コメント

タイトルとURLをコピーしました