Apakah saya memerlukan bidang nonce untuk setiap kotak meta yang saya tambahkan ke admin jenis pos kustom saya?


16

Saat ini saya sedang mengerjakan halaman admin dari jenis pos kustom saya, dan saya buntu memutuskan apakah akan menambahkan bidang nonce lagi untuk metabox kedua atau tidak. Saya sangat baru untuk jenis posting khusus, dan mencari online tentang hal ini tidak benar-benar menghasilkan banyak hasil.

Adakah pikiran? Terima kasih.

Jawaban:


13

Saya akan merekomendasikannya.

Anda memang (dan harus) memiliki hak Anda sendiri yang dapat digunakan untuk memeriksa asal data dan maksud pengguna. Jika Anda hanya memiliki satu nonce untuk metabox - maka Anda mengalami masalah jika metabox tersebut dihapus (tidak sama dengan disembunyikan). Jika dihapus, kotak kedua akan (atau paling tidak seharusnya) tidak pernah menyimpan karena paket tersebut lebih lama dikirim.

Tentu saja dari sudut pandang keamanan, tidak ada yang ditambahkan dengan nilai kedua - kecuali jika Anda hanya ingin memperbarui satu metabox dan bukan yang lain: nonce harus unik untuk tindakan tersebut .


Edit

Seperti yang ditunjukkan hanya ada satu formulir untuk layar edit posting. Jadi, secara teori, Anda hanya perlu satu bidang nonce untuk memvalidasi tindakan dan asal data. Namun, karena metabox dapat dihilangkan - dengan memiliki bidang nonce hanya dalam satu metabox, tidak ada jaminan bahwa nonce akan ada di sana. Dengan menempatkan bidang nonce di setiap metabox Anda dapat memeriksa apakah data dari metabox itu telah dikirim (dan sebenarnya dari tempat Anda pikir itu) sebelum memproses data apa pun. Misalnya:

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.
  }

}

The nama dari bidang Nonce harus unik untuk metabox (dan tidak berbenturan dengan nonces lainnya yang hadir pada bentuk dari plug-in).

Nonce nilai harus unik untuk aksi (dan ini umumnya harus mencakup asal data (misalnya mengedit-posting yang bertentangan dengan cepat-edit)). Saya biasanya memasukkan ID posting juga.


hmm tetapi hanya ada satu <form>tag di halaman admin. haruskah bidang nonce unik dengan formulir atau tidak? tia, @Stephen
Ana Ban

Ya, jadi nama nonce harus unik untuk metabox sehingga Anda dapat memeriksanya untuk setiap metabox. Nilai nonce harus unik untuk tindakan yang dilakukan dan asal data (misalnya karena 'edit cepat' dan layar edit normal keduanya memicu save_posttindakan).
Stephen Harris

jawaban yang diperbarui untuk mudah-mudahan memperjelas apa yang saya katakan :)
Stephen Harris

Masalahnya adalah 1) karena hanya ada satu Formulir-tag untuk seluruh layar edit dan 2) secara otomatis memiliki Nonce ditambahkan ke dalamnya. Mengapa Anda harus menambahkan lebih banyak? Itu akan selalu memiliki nilai apa pun ... Saya menunjukkan ini dalam jawaban saya dan mendapatkan undian suara, terima kasih orang-orang ... Maksudnya adalah dalam pandangan saya untuk mengedit halaman dengan konten atau meta data misalnya. satu bidang nonce ... Juga ketika saya mencoba untuk menambahkan lebih banyak bahkan tidak berfungsi dengan beberapa meta-kotak !!
OZZIE

1
Lihat jawaban saya. save_postdapat dipanggil dari berbagai konteks, sehingga notce tidak dijamin. Ini juga cara mudah untuk memeriksa bahwa panggilan balik Anda sebenarnya harus melakukan sesuatu. Saat menambahkan beberapa nonces, gunakan nama unik. Itu berhasil.
Stephen Harris

5

Anda juga bisa mengaitkan kotak kirim yang tidak pernah hilang menambahkan bidang nonce ke dalamnya

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

Lalu, dalam tindakan save_post Anda:

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

1

Bidang nonce digunakan untuk memvalidasi bahwa isi formulir berasal dari lokasi di situs saat ini dan bukan di tempat lain.

codex: wp_nonce_field

hanya satu bidang nonce per formulir diperlukan, gunakan lebih dari satu bidang yang tidak masuk akal bagi saya.

mungkin Anda dapat menyelidiki dan menggunakan check_admin_referer () untuk memastikan permintaan Anda berasal dari halaman admin


-1

Di WP 3.5.2 Seluruh halaman edit dibungkus dengan tag-bentuk sehingga Anda TIDAK harus menambahkan tag-bentuk Anda sendiri !! Jika masih melakukan itu dan mencoba untuk menambahkan kotak meta kustom lain yang terpisah itu akan gagal saat menyimpan dan hanya membawa Anda ke rumah wp-admin ketika mencoba menyimpan !!

JANGAN menambahkan bidang NONCE juga karena seharusnya hanya ada satu per formulir (ini juga bisa membuatnya gagal !!) Dan halaman edit sudah memiliki bidang nonce!

Edit:

Masalahnya adalah 1) karena hanya ada satu Formulir-tag untuk seluruh layar edit, sebagai penulis jawaban yang benar telah mengakui, dan 2) secara otomatis memiliki Nonce ditambahkan ke dalamnya. Mengapa Anda harus menambahkan lebih banyak? Itu akan selalu memiliki nonce tidak peduli apa ...

The niat adalah dalam pandangan saya untuk mengedit halaman dengan konten atau data meta misalnya. satu bidang nonce ... Juga ketika saya mencoba untuk menambahkan lebih banyak bahkan tidak berfungsi dengan beberapa meta-kotak !! Satu akan bekerja dan yang lainnya akan gagal dan hanya mengarahkan pengguna ke rumah wp-admin!


Anda telah memposting jawaban yang sama pada dua pertanyaan, apakah itu kebetulan? Manakah dari dua yang Anda maksud untuk membalas?
Rarst

Maaf kebetulan, yang ini. Jika Anda menggunakan pembakar atau komponen tampilan krom dari kotak meta yang ditambahkan dengan tag-formulir di wp 3.6 itu secara otomatis menghapus yang dibungkus dalam seluruh bentuk untuk posting. Jadi bagaimana ini salah? Mengapa Anda menambahkan beberapa bidang nonce?
OZZIE

Cobalah dan Anda akan melihat
OZZIE
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.