Sistem login merupakan fitur dasar yang banyak digunakan pada website, mulai dari blog, portal berita, hingga aplikasi administrasi. Melalui sistem ini, pengguna dapat masuk ke halaman tertentu menggunakan username dan password.
Dalam pembelajaran PHP, fungsi md5() kerap digunakan untuk mengenalkan konsep hashing password. Namun, MD5 sudah tidak aman untuk penyimpanan password karena prosesnya sangat cepat dan tidak dirancang untuk menghadapi serangan penebakan password modern.
Pada tutorial ini, kita akan mempelajari struktur sistem login PHP dan MySQL menggunakan MD5 sebagai contoh pembelajaran, bukan rekomendasi untuk aplikasi produksi.
1. Mengenal Fungsi MD5 dalam PHP
MD5 merupakan algoritma hash yang menghasilkan nilai sepanjang 128 bit atau biasanya ditampilkan sebagai 32 karakter heksadesimal.
Contoh penggunaannya:
<?php
echo md5("admin123");
Fungsi tersebut menghasilkan hash dari teks admin123. Hasilnya bukan enkripsi yang dapat didekripsi kembali, melainkan nilai hash yang dihitung dari input.
Meskipun secara umum perubahan input akan menghasilkan hash berbeda, MD5 memiliki kelemahan keamanan dan tidak cocok untuk menyimpan password. Untuk aplikasi nyata, PHP menyediakan fungsi khusus seperti password_hash() dan password_verify().
2. Membuat Database dan Tabel Users
Langkah pertama adalah membuat database untuk menyimpan akun pengguna.
CREATE DATABASE db_login_md5;
USE db_login_md5;
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
Kolom username dibuat unik agar tidak ada dua akun dengan username yang sama. Kolom password disediakan untuk menyimpan hash password pada contoh pembelajaran ini.
Untuk membuat akun demonstrasi, jalankan:
INSERT INTO users (username, password)
VALUES ('admin', MD5('admin123'));
Penting: Jangan menggunakan cara penyimpanan MD5 ini pada akun sungguhan. Pada aplikasi produksi, simpan hasil password_hash() dan verifikasi menggunakan password_verify().
3. Membuat Koneksi Database dengan config.php
Buat file config.php untuk menghubungkan PHP dengan database MySQL.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$host = "localhost";
$username = "root";
$password = "";
$database = "db_login_md5";
$koneksi = new mysqli(
$host,
$username,
$password,
$database
);
$koneksi->set_charset("utf8mb4");
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
Sesuaikan nama pengguna, password, dan database dengan konfigurasi server. Contoh di atas menggunakan akun lokal untuk pembelajaran; pada server produksi, gunakan akun database dengan hak akses terbatas dan simpan kredensial secara aman.
4. Membuat Form Login
Buat file login.php yang menampilkan kolom username dan password.
<?php
session_start();
if (isset($_SESSION["login"]) && $_SESSION["login"] === true) {
header("Location: dashboard.php");
exit;
}
$error = isset($_GET["error"]);
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login PHP</title>
<style>
body {
background: #f4f4f4;
font-family: Arial, sans-serif;
}
.box {
max-width: 300px;
margin: 100px auto;
padding: 20px;
background: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
input,
button {
box-sizing: border-box;
width: 100%;
padding: 10px;
margin: 10px 0;
}
button {
background: #007bff;
color: #fff;
border: none;
cursor: pointer;
}
.error {
color: #c00;
}
</style>
</head>
<body>
<div class="box">
<h2>Login</h2>
<?php if ($error): ?>
<p class="error">Username atau password salah.</p>
<?php endif; ?>
<form method="POST" action="proses_login.php">
<label for="username">Username</label>
<input
type="text"
name="username"
id="username"
maxlength="50"
autocomplete="username"
required
>
<label for="password">Password</label>
<input
type="password"
name="password"
id="password"
autocomplete="current-password"
required
>
<button type="submit">Masuk</button>
</form>
</div>
</body>
</html>
Form ini mengirim data menggunakan metode POST ke proses_login.php. Atribut required membantu validasi di browser, tetapi pemeriksaan di server tetap diperlukan.
5. Membuat Proses Login dengan PHP
Buat file proses_login.php. Script ini memeriksa data pengguna melalui prepared statement.
<?php
require_once "config.php";
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
header("Location: login.php");
exit;
}
$usernameInput = trim($_POST["username"] ?? "");
$passwordInput = $_POST["password"] ?? "";
if ($usernameInput === "" || $passwordInput === "") {
header("Location: login.php?error=1");
exit;
}
$passwordHash = md5($passwordInput);
$stmt = $koneksi->prepare(
"SELECT id, username
FROM users
WHERE username = ? AND password = ?
LIMIT 1"
);
$stmt->bind_param("ss", $usernameInput, $passwordHash);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
if ($user) {
session_regenerate_id(true);
$_SESSION["login"] = true;
$_SESSION["user_id"] = $user["id"];
$_SESSION["username"] = $user["username"];
header("Location: dashboard.php");
exit;
}
header("Location: login.php?error=1");
exit;
Berikut beberapa bagian penting dalam proses login:
trim()menghapus spasi di awal dan akhir username.md5()menghitung hash password untuk dibandingkan dengan data demonstrasi di database.prepare()danbind_param()membantu mencegah SQL injection.session_regenerate_id(true)mengganti ID session setelah autentikasi berhasil untuk membantu mencegah session fixation.header("Location: ...")mengarahkan pengguna ke halaman yang sesuai.
Perlu diingat, prepared statement melindungi query SQL dari injeksi, tetapi tidak membuat MD5 aman untuk menyimpan password.
6. Membuat Halaman Dashboard
Buat file dashboard.php untuk menampilkan halaman setelah login berhasil.
<?php
require_once "config.php";
if (
!isset($_SESSION["login"]) ||
$_SESSION["login"] !== true
) {
header("Location: login.php");
exit;
}
$username = htmlspecialchars(
$_SESSION["username"],
ENT_QUOTES,
"UTF-8"
);
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dashboard</title>
</head>
<body>
<h1>Halo, <?= $username ?>!</h1>
<p>Login berhasil. Selamat datang di dashboard.</p>
<form action="logout.php" method="POST">
<button type="submit">Logout</button>
</form>
</body>
</html>
Pemeriksaan session mencegah pengguna yang belum login mengakses dashboard. Fungsi htmlspecialchars() digunakan untuk menghindari penyisipan HTML berbahaya ketika username ditampilkan.
7. Membuat Fitur Logout
Buat file logout.php untuk mengakhiri sesi pengguna.
<?php
require_once "config.php";
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
header("Location: dashboard.php");
exit;
}
$_SESSION = [];
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(),
"",
time() - 42000,
$params["path"],
$params["domain"],
$params["secure"],
$params["httponly"]
);
}
session_destroy();
header("Location: login.php");
exit;
Pada aplikasi produksi, tambahkan token CSRF pada form logout dan konfigurasi cookie session menggunakan HTTPS serta atribut keamanan yang sesuai.
8. Kekurangan MD5 untuk Password
MD5 memiliki beberapa kelemahan utama:
- Proses hashing sangat cepat sehingga penyerang dapat mencoba banyak kombinasi password dalam waktu singkat.
- MD5 tidak menyediakan salt otomatis untuk password.
- Algoritmanya memiliki kelemahan collision dan tidak dirancang sebagai password hashing modern.
- Password yang lemah dapat lebih mudah ditebak melalui kamus hash yang sudah tersedia.
Karena itu, MD5 tidak boleh dipakai untuk menyimpan password akun pada website yang digunakan pengguna sungguhan.
9. Alternatif yang Lebih Aman: password_hash() dan password_verify()
Untuk aplikasi modern, gunakan fungsi bawaan PHP berikut.
Saat membuat akun:
$passwordHash = password_hash(
$passwordInput,
PASSWORD_DEFAULT
);
Simpan $passwordHash ke kolom password menggunakan prepared statement.
Saat login:
if (password_verify($passwordInput, $user["password"])) {
// Password benar, lanjutkan proses login.
} else {
// Username atau password salah.
}
Fungsi password_hash() menangani salt secara otomatis, sedangkan password_verify() memeriksa password terhadap hash yang tersimpan. Panjang kolom password sebesar 255 karakter seperti pada contoh tabel di atas sesuai untuk menyimpan hash tersebut.
Jika kamu sudah memiliki aplikasi yang menggunakan MD5, jangan sekadar mengganti fungsi verifikasi tanpa rencana migrasi. Siapkan proses transisi yang aman, misalnya memverifikasi hash lama saat login berhasil lalu langsung menggantinya dengan hash baru menggunakan password_hash().
Kesimpulan
Membuat sistem login dengan PHP dan MySQL membantu memahami alur autentikasi, mulai dari form login, query database, session, hingga logout. MD5 dapat diperlihatkan untuk menjelaskan konsep hashing, tetapi bukan pilihan yang aman untuk menyimpan password.
Untuk website yang benar-benar digunakan, gunakan password_hash() dan password_verify(), prepared statement, session yang dikelola dengan benar, HTTPS, serta perlindungan tambahan sesuai kebutuhan aplikasi.

