Sebagai developer web, saya sering membaca artikel tentang hacker, yang dimana hacker tersebut melakukan infiltrasi website melalui metode yang ditakuti yaitu ‘SQL Injection’ dan kemudian hacker tersebut benar-benar mengambil kendali, merubah, mendapatkan akses, atau merusak website yang telah berhasil diobobol olehnya. Sebagai sesama web developer, saya yakin Anda ingin tahu bagaimana untuk melindungi website anda dari SQL Injection. Jika pada artikel sebelumnya saya pernah membahas tentang Cara Menemukan SQL Injections Menggunakan HTTP Logs. Pada artikel ini, Anda akan mengetahui apa itu SQL Injection, apa yang dapat Anda lakukan untuk mencegah serangan SQL Injection, dan rekomendasi tambahan dari saya yang mudah untuk dilakukan untuk membuat website Anda lebih aman.
Sebenarnya, Apa itu SQL Injections?
Pada dasarnya, SQL Injection adalah metode hacking yang digunakan terhadap situs web untuk mendapatkan akses ke data situs yang disimpan di dalam database SQL. SQL Injection digunakan untuk mendapatkan akses ke informasi database, untuk menghancurkan informasi database, atau untuk memanipulasi informasi database.
Contoh :
Misalkan Anda seorang profesional dengan bisnis Anda sendiri. Anda telah membuat database SQL dengan tabel yang berisi semua informasi klien Anda, yang Anda gunakan untuk mengirimkan pemberitahuan penting, penagihan, dll. Anda butuh satu tahun untuk mendapatkan 50.000 klien yang sangat penting.
Contohnya ini adalah SQL query Anda di PHP log-in script Anda :
1 2 3 4 5 |
<? $q = "SELECT `id` FROM `users` WHERE `username`= ' " .$_GET['username']. " ' AND `password`= ' " .$_GET['password']. " ' "; ?> |
1 |
';SHOW TABLES; |
1 |
';DROP TABLE [nama table Anda]; |
Langkah 1 : Gunakan mysql_real_escape_string ()
Fungsi PHP ini pas untuk digunakan dalam query SQL dan melindungi Anda dari serangan. Query Anda sekarang akan terlihat seperti ini:
1 2 3 4 |
<? $q = "SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' "; ?> |
Langkah ke 2 : Gunakan mysql_query () Menggunakan ‘mysql_query ()’ berarti Anda memiliki perlindungan tambahan terhadap SQL Injection. Tanpa ‘mysql_query ()’ dapat memungkinkan hacker untuk menggunakan beberapa perintah SQL dari ‘username’ field Anda, bukan hanya satu, ada juga kerentanan lain. ‘mysql_query ()’ hanya akan memberikan izin satu perintah pada satu waktu. Jadi, query Anda sekarang akan terlihat seperti ini:
1 2 3 4 5 6 7 8 9 10 11 |
<? //connection $database = mysql_connect("localhost", "username","password"); //db selection mysql_select_db("database", $database); $q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ", $database); ?> |
Rekomendasi 1: Pusatkan Koneksi Databese Anda Di dalam script Anda, Anda harus memusatkan koneksi databese Anda ke satu halaman. Pada setiap halaman yang yang dibutuhkan, cukup gunakan fungsi ‘include ()’ untuk memasukkan halaman yang informasi koneksi databasenya di SQL Anda. Hal ini akan memaksa Anda untuk membuat query dengan format yang sama pada setiap halaman yang Anda buat, dan mengurangi kemungkinan kesalahan yang menghasilkan sebuah bug. Jadi, katakanlah kita membuat sebuah file yang disebut ‘connections.php’ dan masukkan kode ini ke dalam file tersebut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<? //connection $database = mysql_connect("localhost", "username","password"); //db selection mysql_select_db("database", $database); ?> We could modify our query using the new setup. Our log-in page would have: <? include("connections.php"); $q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ", $database); ?> |
Rekomendasi 2: Clean Data pada Awal Page Banyak bahasa pemrograman memaksa Anda untuk mendeklarasikan variabel sebelum Anda dapat menggunakannya di sepanjang script. PHP tidak memaksa Anda untuk melakukan hal ini, namun, itu adalah kebiasaan yang baik untuk membersihkan variabel di awal halaman. Tentu seseorang akan bertanya, “Jika saya membersihkan setiap variabel di seluruh halaman, mengapa saya harus membersihkan variabel di atas? Apakah aku tidak melakukan hal yang sama dengan rekomendasi Anda?”. Hal ini lebih mudah jika Anda membersihkan variabel di awal halaman untuk beberapa alasan yang berbeda, di luar format.
- Mengurangi jumlah kode yang Anda tulis.
- Setelah variabel bersih, Anda dapat menggunakannya secara bebas di seluruh halaman, tanpa takut ada sebuah bug.
- Terasa lebih bersih dan lebih terorganisir, memungkinkan Anda untuk bekerja lebih mudah, dan menghindari kesalahan.
Jika kita membersihkan variabel di awal halaman, script kita akan terlihat seperti ini:
1 2 3 4 5 6 7 8 9 10 |
<? include("connections.php"); $username = mysql_real_escape_string( $_GET['username'] ); $password = mysql_real_escape_string( $_GET['password'] ); $q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .$username. " ' AND `password`= ' " .$password. " ' ", $database); ?> |
Mengurangi jumlah yang harus Anda ketikkan lebih lanjut. Lihatlah contoh berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<? function cleaner($input){ //clean variable, including mysql_real_escape_string() } include("connections.php"); $username = cleaner( $_GET['username'] ); $password = cleaner( $_GET['password'] ); $q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .$username. " ' AND `password`= ' " .$password. " ' ", $database); ?> |
Rekomendasi 3: Periksa Lagi, Bahkan Setelah Anda melakukan Cleaning Data Anda dapat melakukan pemeriksaan tambahan untuk mencegah proses yang tidak penting berjalan pada server Anda. Hal ini dicapai dengan menambahkan script check seperti berikut ini :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<? function cleaner($input){ //clean variable, including mysql_real_escape_string() } include("connections.php"); $username = cleaner( $_GET['username'] ); $password = cleaner( $_GET['password'] ); //Check if the input is blank. if( ($password == '') || ($username == '')){ //dont let them pass } //Check if they are putting in way too many characters than should be allowed. else if( (strlen($username) > 20) || (strlen($password)> 20) ){ //dont let them pass } //Passed all of our checks! Run query. else { $q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .$username. " ' AND `password`= ' " .$password. " ' ", $database); } ?> |
Sekarang Anda telah berhasil melakukan pencegahan terhadap SQL Injections. Sekian mengenai Cara Melindungi Website PHP Anda dari SQL Injections. Semoga bermanfaat