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年の記事でこの方法を紹介しています。 […]