たとえば、 このチュートリアル では、メタボックスデータを保存するときに推奨されるコードは次のとおりです。
/* Verify the nonce before proceeding. */
if ( !isset( $_POST['smashing_post_class_nonce'] ) || !wp_verify_nonce( $_POST['smashing_post_class_nonce'], basename( __FILE__ ) ) )
return $post_id;
/* Get the post type object. */
$post_type = get_post_type_object( $post->post_type );
/* Check if the current user has permission to edit the post. */
if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
return $post_id;
nonce
とuser role
のチェックは躊躇しているようで、save_post
にフックするようです。これは、関数wp_insert_post
のほぼ最後の行です。WordPressはすでに必要なチェックを実行しているはずですよね。
それで、それらを安全に削除できますか?
いいえ、違います。あなたはwp_insert_post()
と呼ばれる関数がすでにそれらのチェックを行っていると仮定しています。しかし、wp_insert_post()
は、編集ページだけでなく、プラグイン、あるいはテーマ(それらの多くはセキュリティホール付き)によってではなく、他のページでも使用される可能性があります。
そのため、ナンスを使用して必要な場所でのみコードが実行されるようにする必要があります。
わかりました。コメントの返信が長すぎるため、回答を編集しています。
プラグインがwp_insert_postを公開している場合、それは私の新しいカスタムフィールドがハッキングされるだけでなく、すべての投稿フィールドがハッキングされることになります。 (これもプラグインのバグです)それで、自分のカスタムフィールドを検証してもセキュリティが向上することは実際にはわかりません
しかし、それはあなたのコードの助けを借りて「ハッキング」されるでしょう。ダッシュボードホームのクイック投稿フォームについて考えます。あなたの投稿メタの入力フィールドはありませんね。送信時に、wp_insert_post
- > save_post
が呼び出され、$_POST
にメタフィールドが含まれている場合(ソースを編集して追加するのは簡単です)、メタボックスコードによって保存されます。基本的に、あなたがnonceチェックをしないのなら、あなたがあなたのカスタム入力フィールドを付けたものだけでなく、ポスト編集を含むWordPressのどんなフォームからでもあなたのメタフィールドを変更することを可能にします。これは、あなたの望むことですか?
私は新しいアクションを作成していません。そのため、コアワードプレスのコードがnonceを確認せずにwp_insert_postを呼び出すことを許可している場合、これはWPのバグです。ご覧のとおり、post.phpの中で、それらはすべてcheck_admin_refererを呼び出しています。
wp_insert_post
の目的は投稿を挿入することであり、データがどこから来たのかをチェックすることではありません。しかし、私はsave_post
アクションが不適切に行われたことに同意します。そのような関数はアクションやフィルタを起動してはいけません。代わりに、アクションは各フォーム送信ハンドラによって起動されているはずです。このアクションがWP APIでより矛盾を引き起こすという事実に加えて、それはまた悪用を容易にします...