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

Barbara Streisand
Lepaskan: 2024-11-10 00:06:02
asal
632 orang telah melayarinya

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`)
);
Salin selepas log masuk

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)
        ]
    );
}
Salin selepas log masuk

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
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan