Last Updated on March 10, 2022 by
Penyerangan database seringkali dilakukan oleh orang-orang yang tidak bertanggungjawab. Penyerangan database ini bisa merusak database Anda. Salah satu bentuk penyerangan database ini adalah SQL Injection.
Penyerangan database dengan teknik SQL Injection ini bisa sangat merugikan Anda para pemilik website. Oleh karena itu, kami memberikan beberapa cara untuk mencegah SQL Injection yang ampuh dan mudah.
Table of Contents
Apa itu SQL Injection?
SQL Injection adalah salah satu teknik hacking yang paling seru dilakukan. Injection pada SQL biasanya terjadi ketika Anda meminta input dari pengguna, seperti nama pengguna/id pengguna mereka, dan alih-alih nama/id, pengguna memberi Anda pernyataan SQL yang tanpa sadar akan Anda jalankan di database Anda.
SQL Injection adalah penempatan kode berbahaya dalam pernyataan SQL, melalui input halaman web. Serangan injeksi pada SQL adalah salah satu kerentanan aplikasi web tertua, paling umum, dan paling berbahaya.
Injeksi SQL dapat memengaruhi situs web atau aplikasi web apa pun yang menggunakan database SQL seperti MySQL, Oracle, SQL Server, atau lainnya. Namun SQL Injection juga bisa diterapkan pada pencurian kartu kredit. Penjahat dapat menggunakan teknik hack ini untuk mendapatkan akses tidak sah ke data sensitif Anda: informasi pelanggan, data pribadi, rahasia dagang, kekayaan intelektual dan banyak lagi.
6 Cara Mengatasi SQL Injection
Jika Anda mendapat serangan injeksi SQL pada database Anda, tidak perlu khawatir! Anda bisa mengatasinya dengan 6 cara mengatasi SQL Injection di bawah ini.
1. Input Validation
Cara pertama mencegah serangan pada database adalah dengan melakukan input validation. Proses validasi bertujuan untuk memverifikasi apakah jenis input yang dikirimkan oleh pengguna yang diperbolehkan atau tidak.
Input validation atau validasi input memastikan bahwa itu adalah jenis, panjang, format yang diterima, dan sebagainya. Hanya nilai yang lolos validasi yang dapat diproses. Hal ini membantu melawan perintah apa pun yang dimasukkan ke dalam string input.
Validasi seharusnya tidak hanya diterapkan pada bidang yang memungkinkan pengguna mengetikkan input, artinya Anda juga harus menangani situasi berikut dalam ukuran yang sama:
- Gunakan regular expression sebagai white list untuk data terstruktur (seperti nama, usia, pendapatan, respons survei, kode pos) untuk memastikan validasi input yang kuat.
- Dalam hal kumpulan nilai tetap (seperti daftar drop-down, tombol radio), tentukan nilai mana yang dikembalikan. Data masukan harus sama persis dengan salah satu opsi yang ditawarkan.
Lihat contoh di bawah ini:
switch ($tableName) { case 'fooTable': return true; case 'barTable': return true; default: return new BadMessageException('unexpected value provided as table name'); }
Variabel $tableName kemudian dapat langsung ditambahkan—sekarang dikenal luas sebagai salah satu nilai legal dan yang diharapkan untuk nama tabel. Dalam kasus daftar drop-down, sangat mudah untuk memvalidasi data. Dengan asumsi Anda ingin pengguna memilih peringkat dari 1 hingga 5, ubah kode PHP menjadi seperti ini:
<?php if(isset($_POST["selRating"])) { $number = $_POST["selRating"]; if((is_numeric($number)) && ($number > 0) && ($number < 6)) { echo "Selected rating: " . $number; } else echo " Peringkat harus berupa angka antara 1 dan 5!"; }
Anda telah menambahkan dua pemeriksaan sederhana:
- Harus berupa angka (fungsi is_numeric()).
- Anda mengharuskan $number itu lebih besar dari 0 dan lebih kecil dari 6, yang membuat Anda memiliki kisaran 1-5.
Data yang diterima dari pihak eksternal harus divalidasi. Aturan ini tidak hanya berlaku untuk input yang diberikan oleh pengguna Internet tetapi juga untuk pemasok, mitra, vendor, atau regulator. Vendor ini dapat diserang dan mengirim data yang salah bahkan tanpa sepengetahuan mereka.
2. Parameter queries
Parameter queries atau kueri berparameter adalah sarana untuk melakukan pra-kompilasi pernyataan SQL sehingga Anda kemudian dapat menyediakan parameter agar pernyataan dapat dieksekusi. Metode ini memungkinkan database untuk mengenali kode dan membedakannya dari data input.
Masukan pengguna secara otomatis dikutip dan masukan yang diberikan tidak akan menyebabkan perubahan maksud, jadi gaya pengkodean ini membantu mengurangi serangan injeksi SQL.
Dimungkinkan untuk menggunakan kueri berparameter dengan ekstensi MySQLi, tetapi PHP 5.1 menyajikan pendekatan yang lebih baik saat bekerja dengan database: Objek Data PHP (PDO). PDO mengadopsi metode yang menyederhanakan penggunaan kueri berparameter.
Selain itu, ini membuat kode lebih mudah dibaca dan lebih portabel karena beroperasi pada beberapa database, bukan hanya MySQL. Kode ini menggunakan PDO dengan kueri berparameter untuk mencegah kerentanan injeksi SQL:
<?php $id = $_GET['id']; $db_connection = new PDO('mysql:host=localhost;dbname=contoh_sql_injection', 'dbuser', 'dbpasswd'); //mempersiapkan kueri $sql = "SELECT username FROM users WHERE id = :id"; $query = $db_connection->prepare($sql); $query->bindParam(':id', $id); $query->execute(); //seperti ini hasilnya $query->setFetchMode(PDO::FETCH_ASSOC); $result = $query->fetchColumn(); print(htmlentities($result));
3. Stored Procedures
Stored Procedures (SP) mengharuskan pengembang untuk mengelompokkan satu atau lebih pernyataan SQL ke dalam unit logis untuk membuat rencana eksekusi. Eksekusi selanjutnya memungkinkan pernyataan untuk diparameterisasi secara otomatis.
Sederhananya, ini adalah jenis kode yang dapat disimpan untuk nanti dan digunakan berkali-kali. Jadi, kapan pun Anda perlu menjalankan kueri, alih-alih menulisnya berulang-ulang, Anda bisa memanggil prosedur tersimpan.
Berikut adalah proses pembuatan stored procedure di server MySQL. Misalnya, Anda memiliki tabel seperti ini:
CREATE TABLE `salary` ( `empid` int(11) NOT NULL, `sal` int(11) DEFAULT NULL, PRIMARY KEY (`empid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Misalkan ada seorang karyawan yang perlu mendapatkan data agregat gaji perusahaan dari tabel itu. Pertama, Anda perlu membuat pengguna ‘tr’:
CREATE USER 'tr'@'localhost' IDENTIFIED BY 'passsaya';
SP dibuat sebagai berikut:
DELIMITER $$ CREATE PROCEDURE `avg_sal`(out avg_sal decimal) BEGIN select avg(sal) into avg_sal from salary; END
Proses mengeluarkan perintah membuat avg_sal SP dan akan disimpan dalam database siap dipanggil. Untuk memanggil SP dari aplikasi PHP, Anda dapat menggunakan PDO:
$db_connection = new PDO('mysql:host=localhost;dbname=hris', 'tr', 'mypass'); $query = $db_connection->exec('call avg_sal(@out)'); $res = $query->query('select @out')->fetchAll(); print_r($res);
$res akan menampilkan gaji rata-rata sesuai permintaan pengguna. Kemudian, pengguna dapat melakukan proses output dengan PHP. SP sekarang menghubungkan pengguna (karyawan) dan tabel salary atau gaji yang tidak dapat diakses langsung oleh pengguna, menjadikannya aset penting dalam keamanan database.
4. Escaping
Selalu gunakan fungsi character-escaping functions untuk input yang disediakan pengguna yang disediakan oleh setiap sistem manajemen basis data (DBMS). Hal ini dilakukan untuk memastikan DBMS tidak pernah bingung dengan pernyataan SQL yang disediakan oleh pengembang.
Misalnya, gunakan mysql_real_escape_string() dalam PHP untuk menghindari karakter yang dapat mengarah ke perintah SQL yang tidak diinginkan. Versi yang dimodifikasi untuk skenario pintasan masuk akan terlihat seperti berikut:
$db_connection = mysqli_connect("localhost", "user", "password", "db"); $username = mysqli_real_escape_string($db_connection, $_POST['username']); $password = mysqli_real_escape_string($db_connection, $_POST['password']); $query = "SELECT * FROM users WHERE username = '" . $username. "' AND password = '" . $password . "'";
Sebelumnya, kode Anda akan rentan untuk menambahkan karakter escape (\) di depan tanda kutip tunggal. Namun, memiliki perubahan kecil ini akan melindungi dari pengguna yang tidak sah dan mengurangi SQL Injection.
5. Menghindari hak administratif
Cara kelima menghindari serangan injeksi SQL adalah dengan tidak menghubungkan aplikasi Anda ke database menggunakan akun dengan akses root. Ini harus dilakukan hanya jika benar-benar diperlukan karena penyerang dapat memperoleh akses ke seluruh sistem.
Bahkan server akun non-administratif dapat menempatkan risiko pada suatu aplikasi, terlebih lagi jika server basis data digunakan oleh banyak aplikasi dan basis data. Untuk alasan itu, lebih baik untuk menerapkan hak istimewa paling rendah pada database untuk mempertahankan aplikasi terhadap injeksi SQL.
Pastikan bahwa setiap aplikasi memiliki kredensial basis datanya sendiri dan kredensial tersebut memiliki hak minimum yang dibutuhkan aplikasi. Daripada mencoba menentukan hak akses mana yang harus Anda ambil, fokuslah untuk mengidentifikasi hak akses atau izin yang lebih tinggi yang dibutuhkan aplikasi Anda.
Jika pengguna hanya membutuhkan akses ke beberapa bagian, Anda dapat membuat mode yang secara ketat melayani fungsi ini.
6. Web Application Firewall
Salah satu praktik terbaik untuk mengidentifikasi serangan injeksi SQL adalah memiliki Web Application Firewall (WAF). WAF yang beroperasi di depan server web memantau lalu lintas yang masuk dan keluar dari server web dan mengidentifikasi pola yang merupakan ancaman. Pada dasarnya, ini adalah penghalang antara aplikasi web dan Internet.
WAF beroperasi melalui aturan keamanan web yang dapat disesuaikan dan ditentukan. Rangkaian kebijakan ini menginformasikan kepada WAF kelemahan dan perilaku lalu lintas apa yang harus dicari. Jadi, berdasarkan informasi itu, WAF akan terus memantau aplikasi dan permintaan GET dan POST yang diterimanya untuk menemukan dan memblokir lalu lintas berbahaya.
Nilai WAF sebagian berasal dari kemudahan penerapan modifikasi kebijakan. Kebijakan baru dapat ditambahkan dalam waktu singkat, memungkinkan penerapan aturan yang cepat dan respons insiden yang cepat.
WAF memberikan perlindungan yang efisien dari sejumlah serangan keamanan berbahaya seperti:
- SQL Injection
- Cross-site scripting (XSS)
- Session hijacking
- Serangan penolakan layanan (DDoS) terdistribusi
- Keracunan kue
- Cookie poisoning
Seiring dengan manfaat ini, WAF juga menawarkan:
- Perlindungan otomatis dari berbagai ancaman yang dikenal dan tidak dikenal, dengan tidak hanya kebijakan default yang kuat tetapi juga perbaikan untuk arsitektur WAF spesifik Anda
- Pemantauan keamanan aplikasi waktu nyata dan pencatatan lalu lintas HTTP yang kuat yang memungkinkan Anda melihat apa yang terjadi secara instan
- Mempertimbangkan manfaatnya, bahkan selain mencegah serangan injeksi SQL, WAF harus selalu dianggap sebagai bagian dari strategi pertahanan keamanan web yang mendalam.
Itulah beberapa teknik pencegahan SQL injection yang bisa Anda coba lakukan untuk mencegah serangan pada database Anda. Jika Anda ingin tahu lebih banyak cara lain untuk mencegah serangan database, kunjungi Web App di https://appkey.id/ untuk dapatkan informasi terbaru seputar pengembangan website lainnya.
Jasa Pembuatan Aplikasi, Website dan Internet Marketing | PT APPKEY
PT APPKEY adalah perusahaan IT yang khusus membuat aplikasi Android, iOS dan mengembangkan sistem website. Kami juga memiliki pengetahuan dan wawasan dalam menjalankan pemasaran online sehingga diharapkan dapat membantu menyelesaikan permasalahan Anda.