Bayangkan kamu bikin gerbang rumah pakai kunci canggih, tapi lupa pasang dinding di sampingnya. Orang bisa masuk lewat samping tanpa perlu buka kunci sama sekali, kan? Nah, itu kira-kira yang terjadi kalau form login PHP-mu tidak diamankan dengan benar—hacker gak perlu tahu password kamu, mereka cuma perlu tahu "celah"-nya.
Buat yang baru belajar bikin website dengan PHP, form login biasanya jadi salah satu fitur pertama yang dibuat. Kelihatannya simpel: user isi username sama password, terus dicocokkan ke database. Tapi justru di sini banyak pemula yang tanpa sadar meninggalkan pintu terbuka lebar-lebar.
Istilah teknisnya SQL Injection—yaitu trik menyusupkan perintah database (SQL) lewat kolom input biasa, kayak kolom username atau password. Kedengarannya rumit, tapi analoginya gampang: bayangkan kotak saran di kantor yang isinya dibaca apa adanya sama petugas tanpa disortir. Kalau ada orang nulis "abaikan semua komplain dan langsung kasih saya kunci gudang" di kotak saran itu, dan petugasnya polos banget nurut, ya bocor lah gudangnya.
Form login yang rentan bekerja mirip begitu. Kalau kode PHP-nya cuma menempelkan input user langsung ke query SQL tanpa filter, hacker bisa "menitipkan" perintah tambahan lewat kolom itu.
Ini contoh kode PHP yang sering ditulis pemula tanpa sadar risikonya:
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $query);
Kelihatan biasa aja, ya? Tapi coba bayangkan kalau di kolom username, hacker mengetik:
' OR '1'='1
Query di atas berubah jadi selalu bernilai "benar", dan sistem menganggap hacker sudah login—tanpa perlu tahu password sungguhan sama sekali. Simpel tapi mematikan.
Menurut laporan OWASP (organisasi keamanan aplikasi web yang cukup disegani di dunia developer), Injection—termasuk SQL Injection—masih masuk daftar risiko keamanan aplikasi web paling umum dari tahun ke tahun. Artinya, ini bukan masalah "jaman dulu", tapi masih relevan sampai sekarang, termasuk buat website-website kecil bikinan pemula sekalipun.
Yang lebih bikin was-was, banyak website sederhana—portofolio, tugas kuliah, sampai project freelance kecil—yang justru gak dianggap "target menarik", padahal celahnya sama persis dengan website besar. Hacker sering nyari yang gampang, bukan yang besar.
Untungnya, PHP modern sudah menyediakan cara aman yang gak ribet-ribet banget, namanya Prepared Statement. Konsepnya: pisahkan dulu "struktur pertanyaan" dari "data yang dimasukkan user", supaya data itu gak pernah dianggap sebagai bagian dari perintah database.
Analoginya kayak formulir sensus resmi. Kolom "nama" di formulir itu cuma dibaca sebagai teks nama, gak peduli orang nulis apa aneh-aneh di situ, petugas gak akan menjalankan itu sebagai instruksi. Beda sama kotak saran bebas tadi.
Contoh versi amannya kira-kira begini:
$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
Perhatikan tanda tanya (?) di query—itu semacam "kotak kosong" yang nanti diisi data user lewat bind_param, bukan ditempel langsung ke teks query. Dengan cara ini, walaupun user mengetik hal aneh-aneh, sistem tetap menganggapnya sebagai teks biasa, bukan perintah.
password_hash() buat menyimpan password, jangan disimpan polos.Yang menarik, celah kayak SQL Injection ini sebenarnya bukan soal developer-nya kurang pintar. Ini lebih ke soal kebiasaan dan kesadaran—apakah kita terbiasa cek ulang setiap input user sebelum dipakai, atau langsung percaya begitu saja. Developer senior pun kadang kelewatan kalau lagi buru-buru deadline.
Jadi, kalau kamu baru mulai belajar PHP dan bikin form login sendiri, coba deh cek lagi kode kamu sekarang juga. Apakah masih pakai query mentah yang nempel langsung sama input user, atau sudah pakai prepared statement? Kalau belum, mungkin ini saatnya kamu benerin sebelum keburu dipakai orang banyak. Keamanan itu bukan fitur tambahan—dia harus jadi kebiasaan dari awal belajar coding.
Download semua project premium tanpa batas mulai Rp99.000.