首頁  >  文章  >  後端開發  >  如何在 PHP 登入系統中實現「記住我」功能以增強使用者體驗?

如何在 PHP 登入系統中實現「記住我」功能以增強使用者體驗?

Barbara Streisand
Barbara Streisand原創
2024-11-10 00:06:02645瀏覽

How to Implement

具有「記住我」功能的PHP登入系統[重複]

為了增強使用者體驗,您可以實現「記住我” PHP 登入系統中的功能,允許使用者在多個會話中保持登入狀態。

安全Cookie 儲存

儲存持久Cookie 的最佳實務是使用資料庫中名為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`)
);

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)
        ]
    );
}

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
    }
}

    登入後
  • 登入後,為選擇器和令牌產生唯一的隨機值:
  • 重新認證
重新認證 詳細資料選擇器提供36位抗碰撞能力,防止暴力攻擊。 身份驗證器透過 264 位元隨機性提供了充足的不可預測性。 雜湊可以降低潛在資訊外洩後的冒充風險。 使用 hash_equals() 進行雜湊可防止定時攻擊。 分離選擇器和驗證器可以最佳化資料庫查找。

以上是如何在 PHP 登入系統中實現「記住我」功能以增強使用者體驗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn