目次
PHP ログイン システム: Remember Me (永続 Cookie)
ホームページ バックエンド開発 PHPチュートリアル PHP と Cookie を使用して安全な「Remember Me」機能を実装するにはどうすればよいですか?

PHP と Cookie を使用して安全な「Remember Me」機能を実装するにはどうすればよいですか?

Nov 11, 2024 am 12:26 AM

How can I implement a secure

はじめに

「Remember Me」機能を実装すると、ユーザーはブラウザを閉じた後もログイン状態を維持します。この機能により、ユーザーの利便性が向上し、全体的なユーザー エクスペリエンスが向上します。この記事では、永続的なログイン メカニズムのためにユーザーのブラウザに Cookie を保存および検証する安全な方法について詳しく説明します。

Cookie を安全に保存する

安全にするにはCookie を保存するには、データベース内の別のテーブルを使用します。

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`)
);
ログイン後にコピー

ログイン後のプロセス

「記憶する」オプションを有効にしてログインに成功すると、次のようになります。

  • 12 文字のセレクターを生成します (たとえば、base64_encode(random_bytes(9)) を使用します)。
  • 33 バイトの認証子を生成します (たとえば、random_bytes(33) を使用します)。
  • Cookie に次の値を設定します:

    'remember': $selector.':'.base64_encode($authenticator)
    ログイン後にコピー
  • セレクター、ハッシュされた認証子、ユーザー ID、および有効期限を auth_tokens データベース テーブルに保存します。

ページ読み込み時の再認証

ユーザーを再認証するには:

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

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

    if (hash_equals($row['token'], hash('sha256', base64_decode($authenticator)))) {
        $_SESSION['userid'] = $row['userid'];
        // Regenerate login token and update database
    }
}
ログイン後にコピー

アプローチの詳細

  • 衝突耐性: セレクターに 9 バイトを使用すると、72 ビットのキースペースが提供され、十分な衝突耐性が確保されます。
  • 偽装保護: ハッシュされた認証子をデータベースに保存すると、なりすましのリスクが軽減されます。
  • タイミング攻撃対策: 比較前に認証子の値をハッシュし、認証子からセレクターを分離することで、タイミング リークを防ぎます。
  • データベース セキュリティ: auth_tokens テーブルを使用すると、期限切れのトークンを簡単に削除および期限切れにし、データベースの整合性を維持できます。

以上がPHP と Cookie を使用して安全な「Remember Me」機能を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

11ベストPHP URLショートナースクリプト(無料およびプレミアム) 11ベストPHP URLショートナースクリプト(無料およびプレミアム) Mar 03, 2025 am 10:49 AM

11ベストPHP URLショートナースクリプト(無料およびプレミアム)

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelでフラッシュセッションデータを使用します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelテストでの簡略化されたHTTP応答のモッキング

Instagram APIの紹介 Instagram APIの紹介 Mar 02, 2025 am 09:32 AM

Instagram APIの紹介

LaravelのバックエンドでReactアプリを構築する:パート2、React LaravelのバックエンドでReactアプリを構築する:パート2、React Mar 04, 2025 am 09:33 AM

LaravelのバックエンドでReactアプリを構築する:パート2、React

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPのカール:REST APIでPHPカール拡張機能を使用する方法

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

Codecanyonで12の最高のPHPチャットスクリプト

Laravelの通知 Laravelの通知 Mar 04, 2025 am 09:22 AM

Laravelの通知

See all articles