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 %s and %s is called placeholder. The %s is used for string placeholder and %d is used for integer place holder. Wordpress only support this two type placeholder.

Further Information :

  • Digg
  • del.icio.us
  • Facebook
  • Google
  • MySpace
  • Reddit
  • StumbleUpon
  • Technorati
  • Design Float
  • Furl
  • LinkedIn

Possibly Related Post(s)

Tags : , , , , , ,

23 Comments so far

  • wah ini cara-cara nghack website ya lae?? ajarin dund lae…hwhehe.. keren dah bisa bikin template sendiri..

    at 10 July 2009, 10:48 AM
  • Pertamax!
    Ijin kopas:-D

    at 10 July 2009, 10:52 AM
  • @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

    at 10 July 2009, 11:32 AM
  • 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 ?

    at 10 July 2009, 11:58 AM
  • hey…gan…comment gue kemana ? masih dimoderasi ?

    at 10 July 2009, 12:00 PM
  • @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

    at 10 July 2009, 12:13 PM
  • langsung dicoba ah gan…
    btw horas bah..
    mantap tuh tutorialnya

    at 10 July 2009, 13:50 PM
  • horas gan…
    langsung dicoba ah…mantap tuh tutorialnya..:)

    at 10 July 2009, 13:53 PM
  • Blog ku belum layak publish, masih di hd.. Tenang bro, q link ntar

    at 10 July 2009, 13:53 PM
  • @mike : horas juga. headernya dalam tahap pengerjaan. hehehe… sabar ya bang.

    at 10 July 2009, 14:37 PM
  • @didta : bakal di publish di mana? domain baru kah?

    at 10 July 2009, 14:50 PM
  • 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

    at 10 July 2009, 15:37 PM
  • @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. hehehehe

    at 10 July 2009, 15:45 PM
  • Ini 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 ?

    at 10 July 2009, 16:46 PM
  • @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?

    at 10 July 2009, 16:49 PM
  • 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)

    at 12 July 2009, 10:36 AM
  • wah ini dia nih .. top post …
    mau periksa dulu … hehehe …
    thanks banget bang …

    at 12 July 2009, 18:21 PM
  • tetapi bukankah secara default wp telah menggunakan prepare() ? apakah ini lebih ditujukan pada plugin ya bang?

    at 12 July 2009, 18:39 PM
  • @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.

    at 13 July 2009, 15:18 PM
  • 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

    at 14 July 2009, 8:43 AM
  • @planet orange : bisa menggunakan fungsi sprintf() bang. coba baca manual php. karena fungsi $wpdb->prepare() ini menggunakan fungsi sprintf()

    at 14 July 2009, 9:27 AM
  • Oooo… ic..ic…

    bener banget bang Ganda..ini sambil baca baca php manual…

    at 14 July 2009, 9:59 AM
  • @planet orange : aduh… jangan panggil bang dong bang…(parah bahasa indonesia saya). i’m not that old..

    at 14 July 2009, 10:10 AM

feel free to leave a comment

About The Author

I am Ganda Manurung, a tweenty of something Web Addicted Developer. I currently live on Bogor, West Java. You can contact me at my[firstname].[lastname]@gmail.com.

Recent POST

XHTML VALID

Subscription