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 | <form method="post"> |
- HTML
1 | <form method="post"> |
check_admin_referer
現在のリクエストが有効なnonceを持つか、または現在のリクエストが管理画面から参照されたものであるかをテストする。
どちらのテストを行うかは、$actionが与えられているかによる。
例)
失敗すると check_admin_referer() は自動的に “failed” ページを表示して終了 (die) する。
1 | if ( ! empty( $_POST ) && check_admin_referer( 'name_of_my_action', 'name_of_nonce_field' ) ) { |
例)
1 | if (isset($_POST['name_of_nonce_field']) && $_POST['name_of_nonce_field']) { |
check_admin_referer と wp_verify_nonce
check_admin_referer
管理画面内でフォームを送信して処理する場合に使用する。現在のリクエストが有効な nonce を持っているか、また現在のリクエストが管理画面から参照されたものであるかを確認する。
wp_verify_nonce
現在の陸ストが有効な nonce を持っていることを指定されたアクションとの関係性とともに確認する。どこから参照されrているかは判断しない。
nonce の有効期間
初期値の24時間から有効期間を変更する。
1 | add_filter( 'nonce_life', 'my_nonce_life' ); |