PHP と Cookie を使用して安全な「Remember Me」機能を実装するにはどうすればよいですか?
Nov 11, 2024 am 12:26 AMPHP ログイン システム: Remember Me (永続 Cookie)
はじめに
「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 までご連絡ください。

人気の記事
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌

人気の記事
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック
Gmailメールのログイン入り口はどこですか?
7133
9


Java チュートリアル
1534
14


Laravel チュートリアル
1256
25


PHP チュートリアル
1205
29


CakePHP チュートリアル
1153
46



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