Daftar Isi
- Daftar Isi
- Apa itu SQL Injection?
- Bahaya SQL Injection
- Solusi: Prepared Statement dan Parameterized Query
- Praktik Terbaik Lainnya untuk Mencegah SQL Injection
- Kesimpulan
Apa itu SQL Injection?
SQL Injection adalah teknik serangan yang memanfaatkan celah keamanan pada aplikasi yang berinteraksi dengan database. Penyerang bisa menyisipkan kode SQL berbahaya melalui input pengguna yang tidak tervalidasi dengan baik, sehingga kode tersebut dieksekusi oleh database.
Contoh Serangan SQL Injection
Misalkan sebuah aplikasi memiliki fitur login dengan query seperti ini:
SELECT * FROM users WHERE username = '$username' AND password = '$password'
Jika aplikasi tidak memvalidasi input $username
dan $password
dengan benar, penyerang bisa memasukkan nilai seperti ini:
username: admin'--
password: apapun
Query akhirnya akan menjadi:
SELECT * FROM users WHERE username = 'admin'-- AND password = 'apapun'
Penyerang berhasil login sebagai admin tanpa perlu tahu passwordnya!
Bahaya SQL Injection
Serangan SQL Injection bisa berakibat fatal, seperti:
- Penyerang mendapatkan akses tidak sah ke data sensitif
- Data bisa diubah, dihapus, atau ditambahkan secara ilegal
- Dalam kasus terburuk, penyerang bisa mengeksekusi perintah berbahaya di server database
Bahkan perusahaan besar pernah menjadi korban SQL Injection. Pada 2015, peretas berhasil mencuri data 191 juta pemilih AS dari database milik Komisi Pemilihan Federal AS melalui SQL Injection.
Solusi: Prepared Statement dan Parameterized Query
Solusi paling ampuh untuk mencegah SQL Injection adalah dengan menggunakan Prepared Statement dan Parameterized Query.
Apa itu Prepared Statement?
Prepared Statement adalah fitur di banyak bahasa dan framework yang memungkinkan Anda memisahkan SQL query dari data. Query disiapkan terlebih dulu dengan “placeholder” untuk data (seperti ?
atau $1
), baru kemudian data diikat ke query secara terpisah.
Contoh dalam PHP dengan PDO:
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ? AND password = ?');
$stmt->execute([$_POST['username'], $_POST['password']]);
Keunggulan Prepared Statement
Prepared Statement mencegah SQL Injection karena:
- SQL query dan data dipisahkan, sehingga data tidak bisa mempengaruhi struktur query
- Database bisa membedakan mana SQL dan mana data
- Karakter khusus dalam data secara otomatis di-escape
Selain lebih aman, Prepared Statement juga membuat kode lebih rapi dan meningkatkan performa karena query bisa dikompilasi terlebih dulu.
Contoh Penggunaan Prepared Statement di Berbagai Bahasa
-
PHP dengan PDO atau MySQLi
// Contoh di atas menggunakan PDO $stmt = $pdo->prepare('SELECT * FROM users WHERE username = ? AND password = ?'); $stmt->execute([$_POST['username'], $_POST['password']]); // Dengan MySQLi $stmt = $mysqli->prepare('SELECT * FROM users WHERE username = ? AND password = ?'); $stmt->bind_param('ss', $_POST['username'], $_POST['password']); $stmt->execute();
-
Python dengan SQLite3
cursor.execute('SELECT * FROM users WHERE username = ? AND password = ?', (username, password))
-
Java dengan JDBC
PreparedStatement stmt = con.prepareStatement( "SELECT * FROM users WHERE username = ? AND password = ?"); stmt.setString(1, username); stmt.setString(2, password); ResultSet rs = stmt.executeQuery();
-
Ruby dengan Active Record
User.where("username = ? AND password = ?", username, password)
Praktik Terbaik Lainnya untuk Mencegah SQL Injection
Selain menggunakan Prepared Statement, beberapa praktik baik lainnya adalah:
- Selalu validasi dan bersihkan input pengguna
- Batasi hak akses database sesuai kebutuhan aplikasi
- Hindari pesan error yang mengungkap detail sistem atau query
- Tetap update dengan patch keamanan terbaru untuk sistem, framework, dan library yang digunakan
Kesimpulan
SQL Injection adalah ancaman serius yang tidak boleh diremehkan oleh developer web. Menggunakan Prepared Statement dan Parameterized Query adalah cara paling efektif untuk mencegah serangan ini. Dengan memisahkan SQL query dari data, aplikasi Anda akan jauh lebih aman dari SQL Injection.
Jadi, mulai sekarang, biasakan selalu menggunakan Prepared Statement setiap kali berinteraksi dengan database. Jangan biarkan aplikasi Anda menjadi korban berikutnya dari SQL Injection!