add_meta_box使用時にプラグイン固有のnonceトークンは必要?
-
投稿画面に新たなmeta_boxを追加して、記事に紐付けられたpostmetaレコードをDBに保存する機能をプラグイン実装しようとしています。
Codexのadd_meta_boxのページのコード例を参考に、以下のような感じに書いてみまして、実際に動きました(php5.3的に書いてます);add_action("add_meta_boxes_somepost_type", function(){ add_meta_box("ほげ","hoge", function($post){ //render hidden input field for nonce wp_nonce_field("HOGEHOGE","hogehoge");//<-----(*) //render some <input> or <select>elements... //(略) //(そのほかいろいろ) ); }; add_action("save_post", function($post_id, $post){ //verify nonce if(!wp_verify_nonce($POST["hogehoge"],"HOGEHOGE")return; //ほか,いろいろverifyする、、、(略) add_post_meta($post_id, "hogehoge", sanitize_text_field($_POST["hogedata"]),true); },10,2);ここで、Codexでの例もそうなんですが、metabox内でプラグイン固有のnonceを作成して、記事をPOSTするときにそれも送って、検証するメリットってあるのでしょうか?
記事をPOSTする時には、デフォルトで_wpnonceが作成されていて、しかもソースを読むとDB保存前にcheck_admin_refererしているので、すでにCSRF対策としての検証は十分なんではないかと思うのです。いちいちadd_meta_boxするたびにnonceトークンを作るのは、冗長ではないかと。どなたか、このメリットについてご存じの方いましたら、教えてください。
-
開発者ではないので正確な実装意図は分かりませんが、wp_verify_nonceで_wpnonceをチェックするだけだと、24時間以内に生成されたnonceなら何でも通ってしまいますので、それが「CSRF対策として十分」かどうか、と言う話になるとおもいます。おそらく、重要な処理においては十分ではないでしょう。全処理が共通のnonceを使ってしまうと、悪意のあるプラグインから重要な処理を行わせることができてしまいます。管理画面共通のnonceは最後の砦で、理想的にはアクションごとに正しい処理手順を踏んだかをチェックすべきです。
hissyさん。
こんにちは。replyありがとうございます。>全処理が共通のnonceを使ってしまうと、悪意のあるプラグインから重要な処理を行わせることができてしまいます。
なるほど。確かにそうですね。悪意のあるプラグイン、というのも想定しなくてはならないのですね。たとえ、ば本番環境でmanage_plugin権限を持っているユーザーがいる様な場合は、まさにそうなりますね。
ところで、英語版のフォーラムでもこの質問を投げかけてみたのですが、
save_postのアクションのなかで、独自nonceではなく$_POSTをarray_key_existsでチェックするのでもよいんでは、という意見も頂きました。***
話がちとそれますが、、、そもそもadd_meta_boxまわりのことをずっと考えていたのも、デフォルトのカスタムフィールドまわりが使いにくくてそれを何とかしたくて、、、かといって気の利いたAPIが用意されているわけでもなく、サードパーティのpluginもどれもしっくりこず、、、。
hissyさんのブログで紹介されていたCustom Fields Template、試してみようかと思ってます。WP3.5のWP_Postクラスも、なかなか便利そうですね(でも、画像アップロード周りのUIと実装が、がらっと変わってしまってるのが、つらい)。どちらかと言うと、なんかとりあえず全画面にnonceが入ってるっていう方が変だなぁと思うのですが、それだけnonceチェックしない開発者が多いってことなんだろうなーと思ったりしています
トピック「add_meta_box使用時にプラグイン固有のnonceトークンは必要?」には新たに返信することはできません。