ユーザーエクスペリエンスを向上させるために、PHP ログインシステムに「Remember Me」機能を実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-10 00:06:02
オリジナル
606 人が閲覧しました

How to Implement

「Remember Me」機能を備えた PHP ログイン システム [重複]

ユーザー エクスペリエンスを向上させるために、「Remember Me」機能を実装できます。 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 ログインシステムに「Remember Me」機能を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート