カスタム投稿タイプ管理者に追加するすべてのメタボックスにナンスフィールドが必要ですか?


16

現在、カスタム投稿タイプの管理ページで作業していますが、2番目のメタボックスにnonceフィールドを再度追加するかどうかの決定に固執しました。私はカスタム投稿タイプに非常に新しいので、これについてオンラインで検索してもそれほど多くの結果は得られません。

何かご意見は?ありがとう。

回答:


13

お勧めします。

データの出所とユーザーの意図を確認するための独自のナンスを持っています(そして持っているべきです)。メタボックスのナンスが1つだけの場合、そのメタボックスが削除されると問題が発生します(非表示と同じではありません)。削除された場合、2番目のメタボックスは、nonceがより長く送信されるため、保存されません(または少なくとも保存されるはずです)。

セキュリティの観点から、もちろん、何も二ナンスによって追加されていない-あなたが唯一の他の1 metaboxを更新しないことを望む場合を除き:ナンスがアクションに固有でなければなりません


編集

指摘したように、投稿編集画面にはフォームが1つしかありません。したがって、理論的には、アクションとデータの出所を検証するために必要なノンスフィールドは1つだけです。ただし、メタボックスは削除できるため、1つのメタボックスのみにナンスフィールドを含めることにより、ナンスが存在するという保証はありません。各メタボックスにノンスフィールドを配置することにより、データを処理する前に、そのメタボックスからのデータが送信されているかどうかを確認できます。例えば:

save_post_call_back($post_id){

  //Check this is not an auto-save route

  if(nonce of metabox1 present and valid){
     //Process data from metabox1
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

  if(nonce of metabox2 present and valid){
     //Process data from metabox2
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

}

nonceフィールドの名前は、メタボックスに対して一意である必要があります(他のプラグインからフォームに存在する他のnonceと衝突しないようにします)。

ナンスはアクションに固有である必要があります(また、これには通常、データの起源が含まれている必要があります(クイック編集ではなく編集ポストなど)。私は通常、投稿IDも含めます。


うーん。ただし<form>、管理ページにはタグが1つしかありません。ナンスフィールドはフォームに一意であるかどうか tia、@ Stephen
Ana Ban

はい。したがって、ナンスはメタボックスに対して一意である必要があり、メタボックスごとに確認できます。ナンス値は、実行されたアクションとデータの発信元に対して一意である必要があります(たとえば、「クイック編集」と通常の編集画面の両方がsave_postアクションをトリガーするため)。
スティーブンハリス

答えを更新して、私が言っていることをうまく説明できるように願っています:)
スティーブンハリス

問題は、1)編集画面全体に対してFormタグが1つしかないため、2)ノンスが自動的に追加されるためです。なぜさらに追加する必要があるのですか?それは何であれ常にナンスを持っています...私は私の答えでこれを指摘し、人々に感謝します... 1つのnonceフィールド...さらに追加しようとしたときに、複数のメタボックスでも機能しません!!
オジー

1
私の答えをご覧ください。save_postさまざまなコンテキストから呼び出すことができるため、ナンスは保証されません。また、コールバックが実際に何かをしなければならないことを確認する便利な方法です。複数のナンスを追加する場合は、一意の名前を使用してください。動作します。
スティーブンハリス

5

また、nonceフィールドを追加して消えない送信ボックスをフックすることもできます

add_action( 'post_submitbox_start', 'theme_submitdiv_extra' );
function theme_submitdiv_extra()
{
  wp_nonce_field( 'theme_meta_box_nonce', 'meta_box_nonce' );
}

次に、save_postアクションで:

if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'theme_meta_box_nonce' ) ) return;

1

nonceフィールドは、フォームのコンテンツが現在のサイトの場所からであり、他の場所からではないことを検証するために使用されます。

コーデックス:wp_nonce_field

フォームごとに必要なノンスフィールドは1つだけです。複数のフィールドを使用してください。

たぶん、check_admin_referer()を調べて使用して、リクエストが管理ページからのものであることを確認できます


-1

WP 3.5.2では、編集ページ全体がフォームタグでラップされているため、独自のフォームタグを追加しないでください。それでもそれを行って別のカスタムメタボックスを追加しようとすると、保存時に失敗し、保存しようとするとwp-adminホームに移動するだけです!!

また、フォームごとに1つしか存在しないため、NONCEフィールドも追加しないでください(これにより、失敗する可能性もあります!!)。また、ページ編集には既にnonceフィールドがあります。

編集:

問題は、1)正解の作成者が認めたように、編集画面全体に対してFormタグが1つしかないためです。2)ノンスが自動的に追加されます。なぜさらに追加する必要があるのですか?それは何であれ常にナンスを持ちます...

その意図は、編集に私の見解では、コンテンツやメタデータによってページです例えば。1つのnonceフィールド...さらに追加しようとしたときに、複数のメタボックスでも機能しません!! 1つは動作し、もう1つは失敗し、ユーザーをwp-adminホームにリダイレクトするだけです!


2つの質問に同じ回答を投稿しましたが、偶然ですか?どちらを返信するつもりでしたか?
ラスト

偶然ごめんなさい、これ。wp 3.6でform-tagが追加されたメタボックスのfirebugまたはchromeビューコンポーネントを使用する場合、投稿のフォーム全体にラップされて自動的に削除されます。それで、これはどのように間違っていますか?なぜ複数のナンスフィールドを追加するのですか?
オジー

それを試してみると表示されます
オジー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.