wpdb-> insert: apakah saya harus bersiap menghadapi injeksi SQL?

14

Apakah saya perlu menggunakan persiapan wpdb sebelum memasukkan wpdb->?

Jika saya memasukkan nilai ke dalam tabel wordpress menggunakan wpdb-> insert, apakah saya perlu "membersihkan" data saya sebelum memasukkannya atau apakah metode ini (wpdb-> insert) melakukannya untuk saya?

redconservatory
sumber

Jawaban:

21

Tidak, Anda tidak perlu mempersiapkan atau melarikan diri data, ini dilakukan untuk Anda oleh wpdbkelas.

Dari referensi kelas wpdb :

data :

(array) Data yang akan disisipkan (dalam kolom => pasangan nilai). Baik $ data kolom dan $ data nilai harus "mentah" (tidak juga harus SQL lolos).

Namun, jika Anda menulis SQL Anda sendiri daripada menggunakan insertmetode, maka ya, Anda harus melarikan diri menggunakan prepare.

tak seorangpun
sumber
8
Untuk menambahkan catatan: Keduanya insert& updatetidak membutuhkannya. Tetapi harus digunakan dengan query.
kaiser
1

Berikut ini adalah peringatan untuk kelas wpdb.

https://codex.wordpress.org/Class_Reference/wpdb

Sebuah peringatan

Beberapa fungsi di kelas ini mengambil pernyataan SQL sebagai input. Anda harus SQL melepaskan semua nilai yang tidak tepercaya yang Anda masukkan ke dalam kueri SQL untuk mencegah serangan injeksi SQL. Periksa dokumentasi untuk melihat apakah fungsi yang Anda rencanakan untuk menggunakan escapes SQL untuk Anda atau mengharapkannya lolos.

Jadi saya membaca ini sebagai - kelas wpdb tidak secara otomatis mempersiapkan atau melarikan diri data untuk Anda.

Saya cukup yakin bahwa jika Anda tidak dapat mempercayai 100% sumber data dalam kode Anda, maka saya sarankan menggunakan kelas persiapan (?).

Jangan berpikir bahwa menggunakan kelas persiapan akan memperbaikinya tanpa menggunakan kelas persiapan dengan benar. Saya cukup baru dalam hal ini, jadi silakan kirim koreksi apa pun sebagai balasan jika saya tidak benar.

$ wpdb-> ready ("SELECT * FROM table WHERE ID =% d AND name =% s", $ id, $ name);

Dalam pernyataan di atas, ada 2 atribut tambahan. Satu untuk ID dan satu untuk nama. Sejauh yang saya baca, masing-masing sesuai dengan jumlah item dalam permintaan Anda. Juga% s = string,% d = integer dan% f = float.

Juga, dari bacaan saya, jika Anda tidak memasukkan atribut tambahan, maka mempersiapkan sebenarnya tidak akan melakukan apa-apa. Akan ada peringatan, tetapi jika Anda mematikannya, mungkin Anda tidak akan tahu.

Ini adalah contoh dari referensi kelas itu sendiri di mana mereka menambahkan kelas persiapan ke dalam INSERT di bawah ini.

https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

$ wpdb-> query ($ wpdb-> prep ("INSERT KE $ wpdb-> postmeta (post_id, meta_key, meta_value) VALUES (% d,% s,% s)", array (10, $ metakey, $ metavalue) ));

Kekhawatiran saya adalah bahwa jawaban yang dipilih salah tidak sesuai dengan halaman yang sama yang referensi 'tidak ada'. Saya berasumsi bahwa Anda menggunakan prep () tetapi tidak metode php standar lain untuk melarikan diri karena saya mengambil jawaban ini sebagai benar juga ... sampai saya menggali lebih dalam.

Ngomong-ngomong ... mungkin semuanya sudah berubah sejak jawaban aslinya.

Felixius
sumber
hmmm, ini terdengar lebih seperti sebuah pertanyaan daripada jawaban
Mark Kaplun
Jawaban yang diterima benar. Ketika Anda menggunakan fungsi seperti $wpdb->insert(), $ wpdb-> update () `atau $wpdb->delete()data harus RAW. Dalam situasi di mana Anda menggunakan misalnya $wpdb->query()dan meneruskan pernyataan SQL sebagai input, Anda harus menghindari data yang tidak dipercaya.
nmr
nmr, kurasa aku mengerti sekarang. Jadi untuk memperjelas ... untuk kewarasan saya ... apa yang Anda gunakan sebagai contoh adalah 'metode sisipkan dan' metode hapus 'sebagai kebalikan dari contoh yang saya gunakan menggunakan' metode kueri '... (% wpdb -> permintaan). Apakah saya menghapus jawaban saya? Atau tinggalkan?
Felixius