Di tutorial sebelumnya, kita sudah berhasil membuat Sistem Login Multi-Level untuk memisahkan akses Admin, Dokter, dan Pasien. Namun, ada satu masalah besar: kode tersebut masih sangat rentan terhadap serangan hacker amatir sekalipun.
Jika Anda membangun sistem informasi manajemen klinik, rumah sakit, atau apotek, keamanan data pasien adalah prioritas mutlak. Kebocoran data bisa berujung pada masalah hukum yang serius.
Salah satu celah keamanan paling umum dan berbahaya di PHP adalah SQL Injection. Mari kita bedah apa itu SQL Injection dan bagaimana cara menutup celah ini menggunakan teknik Prepared Statements.
Apa Itu SQL Injection? Kasus pada Form Login
SQL Injection terjadi ketika peretas memasukkan (menginjeksi) kode SQL berbahaya ke dalam kolom input (seperti kolom username atau password) untuk memanipulasi database Anda.
Pada kode login konvensional, kita sering menulis query seperti ini:
$login = mysqli_query($koneksi, "SELECT * FROM tabel_user WHERE username='$username' AND password='$password'");
Jika peretas mengetikkan ' OR '1'='1 di kolom username, maka query yang dibaca MySQL akan berubah menjadi:
SELECT * FROM tabel_user WHERE username='' OR '1'='1' AND password=''
Karena '1'='1' adalah kondisi yang selalu BENAR (TRUE), hacker bisa langsung masuk ke sistem Anda sebagai Admin tanpa perlu tahu password yang sebenarnya! Sangat mengerikan, bukan?
Solusi Ampuh: Menggunakan Prepared Statements (MySQLi)
Cara paling efektif untuk mencegah SQL Injection di PHP adalah dengan menggunakan Prepared Statements. Logikanya, kita memisahkan antara "struktur perintah SQL" dengan "data yang diinputkan pengguna". Sehingga, apapun yang diketik pengguna hanya akan dianggap sebagai teks biasa, bukan sebagai perintah SQL.
Mari kita perbarui file cek_login.php dari tutorial sebelumnya menjadi versi yang kebal hack:
<?php
session_start();
$koneksi = mysqli_connect("localhost", "root", "", "db_klinik_sehat");
// Cek koneksi
if (mysqli_connect_errno()){
echo "Koneksi database gagal : " . mysqli_connect_error();
exit();
}
$username = $_POST['username'];
$password = $_POST['password'];
// 1. Siapkan Query dengan Placeholder (?)
$query = "SELECT username, level FROM tabel_user WHERE username=? AND password=?";
// 2. Persiapkan Statement
$stmt = mysqli_prepare($koneksi, $query);
if ($stmt) {
// 3. Ikat parameter (Bind parameters)
// "ss" berarti ada dua parameter bertipe String (username dan password)
mysqli_stmt_bind_param($stmt, "ss", $username, $password);
// 4. Eksekusi Statement
mysqli_stmt_execute($stmt);
// 5. Ambil hasil eksekusi
mysqli_stmt_store_result($stmt);
// Cek apakah data ditemukan
if(mysqli_stmt_num_rows($stmt) > 0){
// 6. Ikat hasil ke dalam variabel
mysqli_stmt_bind_result($stmt, $db_username, $db_level);
mysqli_stmt_fetch($stmt);
// Set Session berdasarkan level
$_SESSION['username'] = $db_username;
$_SESSION['level'] = $db_level;
if($db_level == "admin"){
header("location:halaman_admin.php");
} else if($db_level == "dokter"){
header("location:halaman_dokter.php");
} else if($db_level == "pasien"){
header("location:halaman_pasien.php");
}
} else {
header("location:index.php?pesan=gagal");
}
// Tutup statement
mysqli_stmt_close($stmt);
} else {
echo "Error dalam query database.";
}
mysqli_close($koneksi);
?>
Penjelasan Kode Prepared Statements
?(Tanda Tanya): Berfungsi sebagai wadah kosong (placeholder). Kita tidak lagi menempelkan variabel$usernamelangsung ke dalam query.mysqli_prepare: MySQL mengompilasi struktur query-nya terlebih dahulu.mysqli_stmt_bind_param: Di sinilah data dimasukkan ke wadah?. Huruf"ss"memberitahu MySQL bahwa kedua data tersebut adalah String (teks). Apapun isinya (termasuk kode hack), akan diperlakukan murni sebagai teks.
Kesimpulan
Jangan pernah meremehkan keamanan sistem rekam medis Anda. Menggunakan Prepared Statements mungkin terlihat sedikit lebih panjang dan rumit di awal, tetapi ini adalah standar industri wajib bagi setiap web developer PHP saat ini untuk menghindari pencurian data.
Anda kini memiliki fondasi database yang kuat, sistem login yang terstruktur, dan keamanan yang tangguh. Di seri artikel berikutnya, kita akan mulai membangun fitur aplikatif seperti Cara Membuat Kalkulator Hari Perkiraan Lahir (HPL) Otomatis dengan PHP. Tunggu artikel selanjutnya!
Belum ada komentar. Jadilah yang pertama berkomentar!