wordpress プラグイン開発するとき、管理画面から option を選択できる設計にすることがあります。そのとき、setting API を活用すると楽になります。
オプションデータを登録/更新/削除するときなど、何らかのアクションを実行するときは、CSRF 対策が必要です。CSRF とは、ユーザーが意図しない操作を行わせる(うっかりリンクを踏む等をさせる→その結果、投稿や削除等が実行される)ものです。
意図しない操作を防ぐため、wp_nonce_field
でトークンを発行し、wp_verify_nonce
で確認する、という手順を組み込みます。こうすることで、登録/更新/削除する作業を行う直前のページが本来想定されているページかどうかをチェックできます。
昔はプラグイン作成者が自分で wp_nonce_field
や wp_verify_nonce
を組み込んでいたのですが、現在では、setting API が用意されています。settings_fields
(wp-admin/includes/plugin.php Line: 1720 - 1724
) を使うと、トークンを作る作業を行ってくれます。
function settings_fields($option_group) { echo "<input type='hidden' name='option_page' value='" . esc_attr($option_group) . "' />"; echo '<input type="hidden" name="action" value="update" />'; wp_nonce_field("$option_group-options"); }
そして、wp-admin/options.php
で、check_admin_referer
という関数がトークンをチェックしてくれます。
if ( 'options' == $option_page && !isset( $_POST['option_page'] ) ) { // This is for back compat and will eventually be removed. $unregistered = true; check_admin_referer( 'update-options' ); } else { $unregistered = false; check_admin_referer( $option_page . '-options' ); }
check_admin_referer
は、wp-includes/pluggable.php Line: 800 - 813
で定義されています。
function check_admin_referer($action = -1, $query_arg = '_wpnonce') { if ( -1 == $action ) _doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2' ); $adminurl = strtolower(admin_url()); $referer = strtolower(wp_get_referer()); $result = isset($_REQUEST[$query_arg]) ? wp_verify_nonce($_REQUEST[$query_arg], $action) : false; if ( !$result && !(-1 == $action && strpos($referer, $adminurl) === 0) ) { wp_nonce_ays($action); die(); } do_action('check_admin_referer', $action, $result); return $result; }
Source View プラグインでも、この Setting API を利用しています。
[…] CSRF対策は、フレームワーク等で用意されていることが多いと思います。例えば FuelPHP なら、FuelPHP でのセキュリティ対策(2)、WordPress なら、setting API を活用した wordpress プラグイン作成等が参考になると思います。 […]
[…] p158では、クロスサイトリクエストフォージェリ対策が書かれています。しかし、WordPressに用意されているSettings APIを使っていません。nonceを自分で埋め込む、という方法を紹介しています。この方法だと、開発者が毎回CSRF対策を気にかけなければなりません。私は、対策漏れやミスが生じやすい方法だと思います。なお、WordPress Codex Creating Options Pages では、Settings APIを使って管理画面を作成しています。当ブログでも、2012年の記事でこの方法を紹介しています。 […]