1. Gunakan Prepared Statements dengan PDO
Prepared statement adalah cara paling aman dan direkomendasikan untuk berinteraksi dengan database.
Contoh:
<?php
$pdo = new PDO("mysql:host=localhost;dbname=nama_db", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->bindParam(':username', $username);
$stmt->execute();
$data = $stmt->fetchAll();
?>
Mengapa aman?
- Parameter :username tidak akan dievaluasi sebagai bagian dari query SQL.
- Database akan memproses parameter sebagai data, bukan sebagai perintah SQL.
2. Gunakan MySQLi dengan Prepared Statements
Jika kamu menggunakan MySQLi, kamu juga bisa menggunakan prepared statements:
<?php
$conn = new mysqli("localhost", "username", "password", "nama_db");
$stmt = $conn->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
?>
3. Validasi dan Sanitasi Input
- Validasi memastikan data memiliki format yang benar (misal: email valid, angka positif, dsb).
- Sanitasi menghapus karakter yang berpotensi berbahaya.
Contoh:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
Catatan: Meskipun sanitasi membantu, ini tidak cukup sendiri untuk mencegah SQL Injection, tapi bagus untuk praktik keamanan secara umum.
4. Hindari Query Dinamis
Jangan pernah menyusun query SQL dengan menggabungkan input pengguna langsung ke dalam string SQL.
Contoh buruk (rentan):
$sql = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "'";
Ini membuka celah SQL injection.
5. Gunakan Hak Akses Database yang Tepat
Jangan gunakan user database dengan hak istimewa penuh (root). Gunakan user dengan hak akses terbatas hanya untuk kebutuhan aplikasi.
6. Sembunyikan Pesan Error SQL
Jangan tampilkan pesan error SQL ke pengguna. Gunakan try-catch untuk menangani error secara elegan.
Contoh:
try {
$pdo->query("SOME QUERY");
} catch (PDOException $e) {
error_log($e->getMessage());
echo "Terjadi kesalahan. Silakan coba lagi.";
}
Kesimpulan
Untuk mencegah SQL Injection dalam PHP:
✅ Gunakan Prepared Statements (PDO atau MySQLi)
✅ Lakukan validasi dan sanitasi input
✅ Hindari query dinamis
✅ Gunakan hak akses terbatas
✅ Tangani error dengan aman