WordPress-nonce

WordPress の管理者画面のセキュリティのために nonce について調べてみました。

nonce とは

詳しい説明はWordPress Nonce にありますが、要はセキュリティを担保するためのセキュリティトークンで、管理画面で何かしらの処理をしようとするときに正当な処理かを確認するために使用されるようです。

例えば、記事を削除しようとすると、http://example.com/wp-admin/post.php?post=123&action=trash&_wpnonce=b192fc4204 にアクセスすることになりすが、_wpnonce が正当なものかを判定すること不正な処理依頼を無効にすることができる。

nonce の仕様

nonce は以下の組み合わせから生成される文字列。

  • ユーザー ID
  • 時刻
  • wp_create_nonce に渡された引数 $action
  • サイト毎に持っている秘密キーと Salt

nonceの種類

  • wp_nonce_field
  • check_admin_referer

wp_nonce_field

使用方法

フォームにhiddenフィールドを追加する。

使用目的

nonceフィールドは、フォームの内容が現在のサイトから来たもので、ほかのサイトからではないことを認証するために使われる。

初期値のまま nonce フィールドを作成すると記事保存時に「本当に実行していいですか?」と確認メッセージが表示される。

例) wp_nonce_field を含むフォームを作成する †

  • コード
1
2
3
<form method="post">
<?php wp_nonce_field( 'アクションの名前', 'nonce フィールドの名前' ); ?>
</form>
  • HTML
1
2
3
<form method="post">
<input type="hidden" id="フィールドの名前" name="フィールドの名前" value="生成された値">
</form>

check_admin_referer

現在のリクエストが有効なnonceを持つか、または現在のリクエストが管理画面から参照されたものであるかをテストする。

どちらのテストを行うかは、$actionが与えられているかによる。

例)

失敗すると check_admin_referer() は自動的に “failed” ページを表示して終了 (die) する。

1
2
3
if ( ! empty( $_POST ) && check_admin_referer( 'name_of_my_action', 'name_of_nonce_field' ) ) {
// フォームのデータを処理する。
}

例)

1
2
3
4
5
if (isset($_POST['name_of_nonce_field']) && $_POST['name_of_nonce_field']) {
if (check_admin_referer('name_of_my_action', 'name_of_nonce_field' )) {
// フォームのデータを処理する。
}
}

check_admin_referer と wp_verify_nonce

check_admin_referer

管理画面内でフォームを送信して処理する場合に使用する。現在のリクエストが有効な nonce を持っているか、また現在のリクエストが管理画面から参照されたものであるかを確認する。

wp_verify_nonce

現在の陸ストが有効な nonce を持っていることを指定されたアクションとの関係性とともに確認する。どこから参照されrているかは判断しない。

nonce の有効期間

初期値の24時間から有効期間を変更する。

1
2
3
4
5
add_filter( 'nonce_life', 'my_nonce_life' );

function my_nonce_life() {
return 3600; /* 1 hour */
}