Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Melaksanakan Fungsi "Ingat Saya" dalam Sistem Log Masuk PHP untuk Pengalaman Pengguna yang Dipertingkatkan?

Bagaimana untuk Melaksanakan Fungsi "Ingat Saya" dalam Sistem Log Masuk PHP untuk Pengalaman Pengguna yang Dipertingkatkan?

Barbara Streisand
Barbara Streisandasal
2024-11-10 00:06:02617semak imbas

How to Implement

Sistem Log Masuk PHP dengan Fungsi "Remember Me" [Pendua]

Untuk meningkatkan pengalaman pengguna, anda boleh melaksanakan "ingat saya" ciri dalam sistem log masuk PHP anda, membolehkan pengguna kekal log masuk merentas berbilang sesi.

Storan Kuki Selamat

Amalan terbaik untuk menyimpan kuki berterusan ialah menggunakan jadual berasingan dalam pangkalan data yang dipanggil auth_tokens:

CREATE TABLE `auth_tokens` (
    `id` integer(11) not null UNSIGNED AUTO_INCREMENT,
    `selector` char(12),
    `token` char(64),
    `userid` integer(11) not null UNSIGNED,
    `expires` datetime,
    PRIMARY KEY (`id`)
);

Selepas Log Masuk

Setelah log masuk, jana nilai rawak unik untuk pemilih dan token:

if ($login->success && $login->rememberMe) {
    $selector = base64_encode(random_bytes(9));
    $authenticator = random_bytes(33);

    setcookie(
        'remember',
        $selector . ':' . base64_encode($authenticator),
        time() + 864000, // 10 days
        '/',
        'yourdomain.com',
        true, // TLS-only
        true  // http-only
    );

    // Insert data into the database
    $database->exec(
        "INSERT INTO auth_tokens (selector, token, userid, expires) VALUES (?, ?, ?, ?)",
        [
            $selector,
            hash('sha256', $authenticator),
            $login->userId,
            date('Y-m-d\TH:i:s', time() + 864000)
        ]
    );
}

Pengesahan Semula

if (empty($_SESSION['userid']) && !empty($_COOKIE['remember'])) {
    list($selector, $authenticator) = explode(':', $_COOKIE['remember']);

    // Retrieve row from the database
    $row = $database->selectRow(
        "SELECT * FROM auth_tokens WHERE selector = ?",
        [
            $selector
        ]
    );

    // Verify hash and set session
    if (hash_equals($row['token'], hash('sha256', base64_decode($authenticator)))) {
        $_SESSION['userid'] = $row['userid'];
        // Regenerate a login token as per previous example
    }
}

Butiran

  • Pemilih menyediakan 36 bit rintangan perlanggaran, menghalang kekerasan serangan.
  • Pengesah menyediakan ketidakpastian yang mencukupi dengan 264 bit rawak.
  • Cincang mengurangkan risiko penyamaran selepas potensi kebocoran maklumat.
  • Cincang dengan hash_equals() menghalang serangan pemasaan.
  • Memisahkan pemilih dan pengesah mengoptimumkan carian pangkalan data.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Fungsi "Ingat Saya" dalam Sistem Log Masuk PHP untuk Pengalaman Pengguna yang Dipertingkatkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn