【WordPressの自作プラグインの設定画面に入力フォームを設置した場合に気をつける基本的なこと】そしてWordCampのあるセッションでプラグイン開発について改めて考えさせられました

WordPressのイベント「WordCamp」にちょっとだけ行ってきまして、おもしろそうなセッションがいくつかあったんですが、その中で、私が最も興味を惹かれたのはプラグイン関連の話題でした。

それで、今まさにプラグインを作っている最中なんですが、ただいま作っているのは、WordPressの管理画面にプラグイン設定画面を追加するもので、フォームに入力する画面があります。つまり、ユーザーが任意で値を入力する箇所があります。

WordPressの管理画面に、プラグイン専用の設定画面を用意することはそんなに難しいことではなかったのですが、個人的に気になるのはやっぱりセキュリティについてです。そこで、フォームを設置する際にセキュリティ対策の1つとして「wp_nonce_field」と「check_admin_refererを1つのセットとして使うことが必要なんだな、と勉強中ながらも理解しました。

wordpressプラグインを作成する時に今後も使いそうなので、以下にメモ書きしています。お時間ありましたら、是非ご覧くださいませ。

まずは、「wp_nonce_field」と「check_admin_referer」についての概要です。

wp_nonce_fieldとは

Codexの英語版の情報です。

http://codex.wordpress.org/Function_Reference/wp_nonce_field

【英文】

The nonce field is used to validate that the contents of the form came from the location on the current site and not somewhere else. The nonce does not offer absolute protection, but should protect against most cases. It is very important to use nonce fields in forms.

 

【訳:自力+google翻訳】

nonce fieldは、表示している管理画面からデータが送信されているか、

また、他所からデータを送信されていないかを確認する時に使用する。

これは完全に防ぐ方法とまでは言えないが、ほとんどの場面で防いでくれる。

フォームにnonce fieldを使うことはとても重要である。

つまりこれはCSRF対策の一環なんだな、と理解しました。CSRF対策については、下記を参照下さいませ。

情報処理推進機構:情報セキュリティ:脆弱性関連情報の取扱い:知っていますか?脆弱性 (ぜいじゃくせい)/3. CSRF (クロスサイト・リクエスト・フォージェリ)

というわけでして、続いて「check_admin_referer」についてです。

check_admin_refererの使い方

こちらもCodexの英語版です。

http://codex.wordpress.org/Function_Reference/check_admin_referer

【英文】

Tests if the current request was referred from an admin page, or (given $action parameter) if the current request carries a valid nonce. Used to avoid security exploits.

【訳:自力+google翻訳】

要求が管理画面からのものかどうか、または渡されたnonceが正確かどうかテストする。

攻撃をされるときに回避するのに使われる。

(※後のサンプルにも出てきますが、不正の場合はエラーメッセージを表示して、処理をしない)

と、ほとんどCodexの情報頼りではありますが、ではそれぞれを「具体的にどんな場面で使用するのか」以下で、そこを押さえておきたいとおもいます。

2つを組み合わせて使うサンプル

以下は、Codexのサンプルです。

【フォームを設置「wp_nonce_field」使用】

<form method="post">
   <!-- input,checkbox,radio,textareaなど追加-->
   <?php wp_nonce_field( 'name_of_my_action','name_of_nonce_field' ); ?>
</form>

「form」タグ内の最後部に「wp_nonce_field」を入れていますね。

【フォームのデータを送信した場合の処理「check_admin_referer」使用】

<?php
// if this fails, check_admin_referer() will automatically print a "failed" page and die.
if ( !empty($_POST) && check_admin_referer( 'name_of_my_action', 'name_of_nonce_field' ) ) {
   //データ更新の処理(update_optionなど)
}
?>

if文の中にはフォームに入力された値の更新処理を書くことになるかと思います。(DBを利用するなら、update_optionなど)それで、値が不正だったら処理はしないよ、ということですね。

これはとても大事なことだ・・・

まとめ

先日のWordCampに参加して特に感じたこととしては、WordPressのテーマやプラグインを自作(開発)される方が多くなってきている流れがあるようで、たぶん私も、計らずもその流れに乗っている状態なんだろうかと思います。そんな流れがある原因としては、「有償化してビジネスにしよう」という側面も多分にあるんじゃないかと思います。その「有償化」について、とても考えさせられる記事がございますので、ご紹介いたします。

WordPressで何かしらを開発される方にとっては、絶対に参考になると思います。

WordCamp Tokyo 2012 でプラグインの有料販売についてお話ししました

また、当日のセッションの内容はこちらです。後で見られるってほんといいですね。

http://www.ustream.tv/recorded/25417830

WordPressに限ったことじゃないですけども、せっかく作るものは安全に使っていただきたいです。開発側での対策は十分に行わないといけないな、と思いました。WordPressは知れば知るほど、新しく知らなかったことがどんどん出てきますね。これもWordPressに限ったことじゃあないですね。

私ももちろん、日々勉強中ということで。でも、勉強中だからといって適当なものは公開できないですね。自分でやれる精一杯のことはやろう。と、改めて気を引き締められた内容でした。

「Newpost Catch」プラグイン専用Facebookページがあります

WordPressプラグイン「Newpost Catch」の活用事例や更新情報などを配信しています。情報を受け取る場合は「いいね!」でフォローくださいますよう、よろしくお願いします。

「Newpost Catch」プラグイン専用ページはこちら

著者:bouya Imamura