Pada tutorial sebelumnya, kita membuat sistem login sederhana dengan membandingkan password secara langsung menggunakan operator ===. Cara tersebut memang mudah dipahami oleh pemula, tetapi tidak aman apabila digunakan pada aplikasi yang berjalan di lingkungan produksi.
PHP telah menyediakan mekanisme keamanan bawaan melalui fungsi password_hash() dan password_verify(). Dengan metode ini, password pengguna akan disimpan dalam bentuk hash sehingga tidak dapat dibaca secara langsung meskipun database berhasil diakses oleh pihak yang tidak berwenang.
Pada artikel ini, kita akan mempelajari cara membuat sistem login yang lebih aman menggunakan password hash.
Mengapa Harus Menggunakan Password Hash?
Menyimpan password dalam bentuk teks biasa (plain text) memiliki risiko yang sangat besar. Apabila database bocor, seluruh password pengguna dapat diketahui.
Contoh yang tidak disarankan:
$password = "admin123";
Di dalam database akan tersimpan:
admin123
Sedangkan dengan password_hash(), password akan berubah menjadi string acak seperti berikut.
$2y$10$hT5rF5Jw9QjM2tJQ1....
Hash tersebut tidak dapat dikembalikan menjadi password asli sehingga jauh lebih aman.
Cara Menyimpan Password ke Database
Saat proses registrasi atau pembuatan akun, gunakan fungsi password_hash().
Contoh:
$password = $_POST['password'];
$password_hash = password_hash($password, PASSWORD_DEFAULT);
Selanjutnya simpan variabel $password_hash ke dalam database.
Contoh query:
$query = $koneksi->prepare("
INSERT INTO users
(nama,username,email,password)
VALUES (?,?,?,?)
");
$query->bind_param(
"ssss",
$nama,
$username,
$email,
$password_hash
);
$query->execute();
Dengan cara tersebut, password yang tersimpan di database sudah dalam bentuk hash.
Membuat Halaman Login
File login.php tetap sama seperti tutorial sebelumnya.
<form method="post" action="proses_login.php">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<input type="submit" value="Login">
</form>
Perbedaannya hanya terdapat pada proses verifikasi password.
Membuat Proses Login Menggunakan password_verify()
Buat atau ubah file proses_login.php menjadi seperti berikut.
<?php
require_once 'config.php';
$username = trim($_POST['username']);
$password = $_POST['password'];
$query = $koneksi->prepare("
SELECT *
FROM users
WHERE username=?
");
$query->bind_param("s",$username);
$query->execute();
$result = $query->get_result();
if($result->num_rows==1){
$user = $result->fetch_assoc();
if(password_verify($password,$user['password'])){
$_SESSION['login']=true;
$_SESSION['id']=$user['id'];
$_SESSION['username']=$user['username'];
$_SESSION['role']=$user['role'];
header("Location: dashboard.php");
exit;
}else{
header("Location: login.php?error=Password salah");
exit;
}
}else{
header("Location: login.php?error=Username tidak ditemukan");
exit;
}
Pada contoh di atas, fungsi password_verify() akan membandingkan password yang dimasukkan pengguna dengan password hash yang tersimpan di database.
Apabila keduanya cocok, pengguna berhasil login.
Perbedaan password_hash() dan password_verify()
password_hash()
Digunakan saat menyimpan password.
$password_hash = password_hash(
$password,
PASSWORD_DEFAULT
);
Fungsi ini hanya dipanggil satu kali, yaitu ketika membuat akun baru atau mengganti password.
password_verify()
Digunakan saat login.
password_verify(
$password,
$user['password']
);
Fungsi ini akan menghasilkan nilai true apabila password yang dimasukkan sesuai dengan hash yang ada di database.
Struktur Tabel Users
Contoh struktur tabel:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100),
username VARCHAR(50),
email VARCHAR(100),
password VARCHAR(255),
role VARCHAR(20)
);
Kolom password sebaiknya menggunakan tipe VARCHAR(255) agar mampu menyimpan hasil hash yang dihasilkan oleh PHP.
Kelebihan Password Hash
Menggunakan password hash memiliki beberapa keuntungan, di antaranya:
- Password tidak tersimpan dalam bentuk teks biasa.
- Lebih aman apabila database bocor.
- Menggunakan algoritma hashing bawaan PHP yang terus diperbarui.
- Direkomendasikan oleh dokumentasi resmi PHP.
- Mudah diimplementasikan tanpa library tambahan.
Tips Keamanan Login
Selain menggunakan password hash, Anda juga disarankan menerapkan beberapa praktik berikut:
- Gunakan Prepared Statement untuk seluruh query database.
- Validasi seluruh input pengguna.
- Gunakan
htmlspecialchars()saat menampilkan data. - Batasi jumlah percobaan login (login attempt).
- Gunakan HTTPS pada website yang sudah dipublikasikan.
- Regenerasi session setelah login menggunakan
session_regenerate_id(true)untuk mengurangi risiko session fixation.
Kesimpulan
Menggunakan password_hash() dan password_verify() merupakan standar keamanan yang wajib diterapkan pada sistem login berbasis PHP. Dengan metode ini, password pengguna tidak lagi disimpan dalam bentuk teks biasa sehingga risiko kebocoran data dapat diminimalkan.
Pada tutorial ini Anda telah mempelajari cara menyimpan password dalam bentuk hash, melakukan verifikasi saat login, serta memahami perbedaan fungsi password_hash() dan password_verify().
Pada artikel selanjutnya, kita akan membahas cara membuat fitur registrasi pengguna menggunakan password hash sehingga akun baru dapat dibuat dengan aman dan langsung terintegrasi dengan sistem login.


Belum ada komentar