Cara Menggunakan Raw Query(Query SQL biasa) dan Mencegahnya dari SQL Injection di Laravel

Posted on Posted in Artikel, Laravel

Laravel umumnya menggunakan Eloquent untuk menjalankan query data. Tetapi terkadang logika aplikasi kita bisa sangat rumit, sehingga menuntut kita untuk membuat query SQL kita sendiri. Laravel Query Builder sebenarnya mempunyai tools untuk mengatasi masalah ini.

Sebenarnya ada satu hal yang harus diperhatikan ketika menulis sebuah query SQL yaitu mencegahnya dari serangan SQL Injection. Normalnya Eloquent memastikan ini untuk kita. Oleh karena itu, jika kita ingin menggunakan query SQL kita sendiri, maka kita harus memastikannya aman dari serangan tersebut.

Untuk menjalankan raw query di laravel, sebenarnya anda cukup menjalankan code berikut :

$some_variable = $request->get(‘some_variable’);

$results = DB::select( DB::raw(“SELECT * FROM some_table WHERE some_column = ‘$some_variable’”));

Hanya dengan code diatas sebenarnya anda sudah bisa menjalankan query anda sendiri, tetapi query tersebut tidak aman untuk dijalankan.

Pada query diatas, kita secara langsung menambahkan input dari user tanpa menyaringnya terlebih dahulu. Ini membuat aplikasi kita dapat diserang.

Nah, bagaimana cara mengatasi masalah ini ? Kita tahu bahwa Laravel Query Builder menggunakan PDO untuk koneksinya, kita juga tahu bahwa ada cara untuk memasukkan bind parameter pada query jadi variable yang bersangkutan bisa disaring terlebih dahulu.

Kita lihat code kita diatas, kita menggunakan DB::raw() untuk membuat query kita, sedangkan untuk menjalankannya kita menggunakan DB::select(). Nah, ayo coba kita lihat bagaimana isi dari method select() di Illuminate\Database\Connection apakah terdapat cara untuk bind parameter atau tidak.

Cari sampai anda menemukan code seperti ini :

public function select($query, $bindings = array())

Dibawah code tersebut anda juga akan menemukan code seperti ini :

$statement = $me->getPdo()->prepare($query);

$statement->execute($me->prepareBindings($bindings));

return $statement->fetchAll($me->getFetchMode());

Nah! Dari code diatas dapat disimpulkan bahwa kita bisa memasukkan sebuah array binding pada method select(). Array ini akan terikat dengan query melalui koneksi PDO.

Dengan ini kita bisa merubah code query kita sebelumnya menjadi seperti ini :

$results = DB::select( DB::raw(“SELECT * FROM some_table WHERE some_column = :some_variable”) , array(

‘some_variable’ => $some_variable,

) );

Nah! Sekarang anda bisa menjalankan query anda sendiri dan aman dari serangan. 🙂

Tambahan Jika anda ingin menjalankan query yang tidak memunculkan data, maka menggunakan method select() akan memunculkan error. Contohnya seperti ketika anda ingin memulai increment suatu table dengan tidak menggunakan 0, maka anda bisa menggunakan method statement(), seperti ini :

DB::statement(‘ALTER TABLE HS_Request AUTO_INCREMENT=9999’);

Anda juga dapat memasukkan parameter agar lebih aman, seperti ini:

DB::statement(‘ALTER TABLE HS_Request AUTO_INCREMENT = :increment_start’, array(‘increment_start’ => 9999));

Sekian. 🙂