Filed in wordpress trick
With 23 Comments
Wordpress Tip : Use Prepared Statement Rather Than Escaping Bad Input!
Many people using escaping function to prevent SQL Injection Attack. It is not good, actually. It is only quote the string with slashes. In wordpress, this can be achieved using $wpdb->escape() function. The $wpdb->escape() function originally using addslashes() PHP function, that we know is not good for preventing SQL Injection Attack. Read Chris Shiflett explanation about disadvantage using addslashes().
The better way to prevent the SQL Injection Attacks is using a prepared statement. This can be achieved using $wpdb->prepare() function. Rather than escaped all variable, this function would create simple and more secure way to insert/update data to database.
Look at the following code. I use $wpdb->escape() to escape every input that might causes injection attack.
$bad_string = "bad string input'";
$bad_integer = get_number();
$bad_string = $wpdb->escape($bad_string);
$bad_integer = $wpdb->escape($bad_integer);
$wpdb->query("UPDATE anyTable SET field1='$bad_string' WHERE field2='$bad_integer' ");
Example Using Prepared Statement
Look at the following code. Rather than using $wpdb->escape(), I prefer using $wpdb->prepare() to prevent any SQL injection attack. In Wordpres Codex stated that escaping should be done as close to the time of the query as possible, that is preferably by using $wpdb->prepare().
$bad_string = "bad string input'";
$bad_integer = get_number();
$wpdb->query($wpdb->prepare("UPDATE anyTable SET field1=%s WHERE field2=%d ", $bad_string, $bad_integer));
Note that our input is not quoted like the previous example. The $wpdb->prepare() will take care of escaping for us. By using this way, no need to escape all inputs manually. Its done just using $wpdb->prepare() function.
The
%sand%sis called placeholder. The%sis used for string placeholder and%dis used for integer place holder. Wordpress only support this two type placeholder.











23 Comments so far
wah ini cara-cara nghack website ya lae?? ajarin dund lae…hwhehe.. keren dah bisa bikin template sendiri..
Pertamax!
Ijin kopas:-D
@new bie oon : bukan. ini cara-cara penanggulangannya. untuk SQL injection attack banyak caranya kok. tapi saran saya, di gunakan untuk coba-coba saja. Hack to learn, not learn to hack.
@didta : mana? hehehehehe
Hack to learn, not learn to hack ? biasanya gan kalo yang baru belajar pasti learn to hack, beda ama yang udah master. Apa musti dijaga bro ? kan kita posting ditempat yang berbayar (Hmmmm….), masak sih keamanan data kita tidak dijaga, lha kalau kena yang oot gimana dong ?
hey…gan…comment gue kemana ? masih dimoderasi ?
@aldy : komennya udah nampil kok. kalau yang baru belajar punya kemauan yang keras menjadi master sejati, pasti mencegah hal itu kok. hacking bukan untuk senang-senang atau pamer. hacking itu adalah sebuah seni. seperti seni bela diri. Contoh yang harus kita jaga adalah bagian komentar ini mengingat semua orang boleh memposting komentar bukan? Tanpa kita jaga dari serangan sql injection, html injection, blog kita bakal fall down. untuk plugin misalnya, siapa tahu ada input-input jahat yang mungkin bisa merusak blog kita. oleh karena itu, sebaiknya pengembangan plugin pun menggunakan model ini
langsung dicoba ah gan…
btw horas bah..
mantap tuh tutorialnya
horas gan…
langsung dicoba ah…mantap tuh tutorialnya..:)
Blog ku belum layak publish, masih di hd.. Tenang bro, q link ntar
@mike : horas juga. headernya dalam tahap pengerjaan. hehehe… sabar ya bang.
@didta : bakal di publish di mana? domain baru kah?
saya malah belum pernah menggunakan prepared statement. Biasanya saya mengecek input dulu.. haha.. kuno nih saya..:D
ya mungkin karena kebiasaan juga sih.
jadi inget.. gimana frameworknya gan? sudah jadi belum?hihihi
@d3ptzz : lebih baik menggunakan prepared statement bro. memudahkan kita dalam pengecekan apakah semua sudah di “aman” kan atau belum. cobalah. lebih menyenangkan. jika tanpa wordpress, gunakan fungsi
sprintf(). Frameworknya belum saya kerjain. ada kerjaan lain yang lebih penting. heheheheIni nih yang sering bikin cilaka, suka inject (injak), meng-inject (menginjak), kalau yang paham mungkin cara menangkal mudah bro, trus untuk oot ada solusi gak ? kalau pake plugin ntar ada sisipan code yang merusak juga repot. Maunya menjaga jangan sampai terjadi, tapi lha wong nggak ngerti kok ?
@aldy : hahaha.. inject bukan injak bang. hehehehe.. abang nih bikin seloroh pandai lah(melayu mode on). OOT di sini maksudnya apa? Out of topic? untuk plugin sebaiknya di periksa dulu semuanya, siapa tahu script plugin tersebut berniat jahat. iya bukan?
Jujur Saya baru tahu tentang alasan code “quote” harus terfilter, ternyata terkait masalah peng-”inject”-an database.
Mengenai masalah inject ini, apakah code yang dituliskan diantara tag <code> dan </code> pada form komentar bisa terkena imbasnya bang?
O iya, dulu bang ganda pernah kasih koment adanya theme yang “tidak aman”. Apakah ini terkait masalah struktur kode di themenya? Atau di function-nya?
Trus bisa dijelaskan ciri2 theme yg tidak aman tsb? (ciri2nya aja, ga usah disebut nama themenya)
wah ini dia nih .. top post …
mau periksa dulu … hehehe …
thanks banget bang …
tetapi bukankah secara default wp telah menggunakan prepare() ? apakah ini lebih ditujukan pada plugin ya bang?
@rismaka : tidak lagi. karena secara default wordpress sudah memfilter tag (< dan >). Bukan struktur kode, namun karena disisipkannya script malware, biasanya berbentuk javascript ke dalam theme tersebut. tapi jika themesnya memiliki fungsi/fitur yang banyak yang bisa diakses dari theme options, ada baiknya di cek dulu. siapa tahu tidak menggunakan prepared statement. walau itu memang tergantung pemiliknya, jika pemiliknya tahu tentang inject database, tidak mungkin dia akan melakukannya. Namun bagi yang tidak tahu menahu tentang ini, dan asal memasukkan input pada text box, sehingga menyebabkan blognya berperilaku tidak normal, sebaiknya pakailah prepare statement.
@nomercy : tidak juga bang. seperti yang saya jelaskan ke bang ady, ada theme juga yang memasukkan sesuatu ketika theme tersebut di pilih. ini yang sebaiknya di cek dulu.
Mas, kasus ini hanya utk wp aja, apa bisa juga diterapkan kl kita hand code, tidak menggunakan CMS yang udah jadi tapi hanya menggunakan framework, soalnya saya juga sering menggunakan escaping function ini…
Mohon pencerahannya
@planet orange : bisa menggunakan fungsi
sprintf()bang. coba baca manual php. karena fungsi$wpdb->prepare()ini menggunakan fungsisprintf()Oooo… ic..ic…
bener banget bang Ganda..ini sambil baca baca php manual…
@planet orange : aduh… jangan panggil bang dong bang…(parah bahasa indonesia saya). i’m not that old..