Saya ingin memastikan semua data di plugin / tema saya ditangani dengan aman sebelum memasukkan basis data dan sebelum di-output ke browser. Masalah saya adalah ada beberapa situasi di mana API menangani sanitasi untuk Anda - seperti saat menyimpan kolom meta pos - dan lainnya di mana pembuat plugin / tema sepenuhnya bertanggung jawab untuk melakukannya - seperti saat menyimpan pengaturan khusus.
Untuk cakupan pertanyaan ini, saya tidak khawatir tentang memvalidasi data di tingkat domain - misalnya, memeriksa bahwa bidang Usia pada formulir adalah antara 0 dan 120, atau bahwa alamat email valid. Saya hanya khawatir tentang keamanan - misalnya, menghindari permintaan SQL untuk menghindari injeksi SQL saat menyimpan ke database, atau membersihkan data yang di-output ke template HTML untuk menghindari XSS.
Untuk sanitasi output, saya tahu bahwa Anda selalu perlu menggunakan fungsi seperti esc_html()
dan esc_attr()
ketika memasukkan variabel ke template HTML. Tapi, bagaimana dengan saat menggunakan tag templat ? Apakah mereka semua sudah membersihkan output? Jika ya, untuk konteks apa (HTML umum, atribut tag, dll)? Beberapa fungsi memiliki varian untuk konteks yang berbeda (seperti the_title_attribute()
, tetapi sebagian besar tidak.
Untuk sanitasi input, saya tahu bahwa saya perlu menggunakan $wpdb->prepare()
ketika membuat kueri manual, tetapi bagaimana dengan saat menggunakan API Pengaturan untuk membuat halaman pengaturan plugin, atau menyimpan kolom meta pos untuk jenis posting khusus?
Saat ini saya baru saja menggali melalui Core dan membaca tutorial setiap kali saya menggunakan fungsi untuk mencari tahu apakah itu membersihkan atau tidak, tapi itu rawan kesalahan dan memakan waktu. Saya berharap menemukan semacam daftar komprehensif dari semua situasi yang mungkin dan apakah API menanganinya atau tidak. misalnya,
API memvalidasi / membersihkan
- Menyimpan meta pos dengan
update_postmeta()
- Menyimpan meta pengguna dengan
update_user_meta()
- Mengeluarkan judul posting - gunakan varian yang sesuai dengan konteks
the_title()
- dll
Anda harus memvalidasi / membersihkan secara manual
- Menyimpan opsi plugin dengan API Pengaturan. Lewati panggilan balik sebagai parameter ke-3 dari
register_setting()
. - Kueri basis data langsung: Bungkus kueri di
$wpdb->prepare()
. - Mengeluarkan variabel dalam HTML. Gunakan
esc_attr()
,esc_html()
, dll - dll
Saya juga tertarik untuk memahami mengapa API menyediakannya dalam situasi tertentu, tetapi tidak yang lain. Saya berasumsi itu ada hubungannya dengan sifat data yang tidak diketahui, tetapi akan senang mendengar penjelasan yang menyeluruh.
the_title()
, the_permalink()
dll) Anda baik-baik saja tetapi dengan data khusus Anda tidak (misalnya get_post_meta()
). Jika ragu, bersihkan diri Anda - tidak ada salahnya.