Password Hashing & Sessions — PHP

Autentikasi web butuh dua fondasi: hash password dengan benar dan kelola session dengan aman. Kenapa JANGAN simpan password plaintext? Jika database bocor…

Autentikasi web butuh dua fondasi: hash password dengan benar dan kelola session dengan aman.

Kenapa JANGAN simpan password plaintext? Jika database bocor, semua password langsung terungkap. Bahkan reversible encryption pun berisiko karena kunci bisa ikut bocor. Hash satu-arah (bcrypt, argon2) mencegah recovery.

Hashing dengan password_hash():

$plain = "rahasia123";
$hash = password_hash($plain, PASSWORD_BCRYPT);
// $2y$10$abc... (60 karakter)

// Simpan $hash ke kolom `password` di DB

PASSWORD_BCRYPT adalah algoritma yang direkomendasikan. PASSWORD_DEFAULT juga aman — akan otomatis pakai algoritma terbaru PHP.

Verifikasi saat login dengan password_verify():

$input = $_POST["password"] ?? "";
$row = $pdo->prepare("SELECT password FROM users WHERE email = ?");
$row->execute([$_POST["email"]]);
$user = $row->fetch();

if ($user && password_verify($input, $user["password"])) {
    // Password cocok — lanjut login
} else {
    // Salah — tampilkan pesan generik, jangan kasih tahu email ada/tidak
    echo "Email atau password salah.";
}

Re-hash otomatis saat algoritma upgrade:

if (password_needs_rehash($user["password"], PASSWORD_BCRYPT)) {
    $baru = password_hash($input, PASSWORD_BCRYPT);
    $upd = $pdo->prepare("UPDATE users SET password = ? WHERE id = ?");
    $upd->execute([$baru, $user["id"]]);
}

Berguna saat kamu upgrade PHP atau ganti algoritma — hash lama di-regenerate tanpa user sadar.

Sessions — session_start():

session_start();

// Simpan data ke session
$_SESSION["user_id"] = 42;
$_SESSION["role"] = "admin";

// Akses di request berikutnya
echo $_SESSION["user_id"]; // 42

session_start() harus dipanggil SEBELUM output apa pun (echo, whitespace).

Regenerate session ID saat login (anti session-fixation):

if (password_verify($input, $user["password"])) {
    session_regenerate_id(true); // Hapus session lama
    $_SESSION["user_id"] = $user["id"];
}

Logout yang benar:

$_SESSION = [];                    // 1. Kosongkan data
session_destroy();                  // 2. Hancurkan session di server
setcookie(session_name(), "", time() - 3600, "/"); // 3. Hapus cookie

Konfigurasi cookie session yang aman:

session_set_cookie_params([
    "httponly" => true,        // JS tidak bisa akses (anti-XSS)
    "secure" => true,          // Hanya via HTTPS
    "samesite" => "Lax",       // Atau "Strict" untuk lebih ketat
    "lifetime" => 0,           // Session-only
]);
session_start();

Panggil SEBELUM session_start().

Yang akan kamu pelajari