コメントで言われたことをすべて 1 つの回答にまとめようと思います。そのため、回答やコメントに賛成票を投じて、他の親切なユーザーに愛を示してください! また、セッションがどのように機能するかについての簡単な概要を説明し、回答をより多くの聴衆に役立つようにします.
ユーザーが Web サイトにログインすると、ユーザーを識別するためのセッションが作成されます。セッションは、セッション ID を作成し、その ID をサーバー側の変数ストアに関連付けることによって PHP で処理されます。これは、$_SESSION
スーパーグローバルを使用して PHP スクリプトでアクセスされます。セッション ID はクライアント側の Cookie に保存され、セッションを識別します。
セキュリティを維持するために、セッション ID は一意で、ランダムで、秘密でなければなりません。攻撃者がセッション ID を推測すると、同じ ID を使用して自分のコンピューターに Cookie を作成し、セッションを乗っ取ることができます。彼らはあなたとしてログインします!これは明らかに悪いことなので、PHP は強力な乱数ジェネレーターを使用してこれらのセッション ID を作成します。物事をより安全にするために、サイト全体で SSL を有効にし、HTTPS-only フラグを使用して SSL 経由でのみ Cookie を送信するようにブラウザに通知できます。ただし、これはサイトにとってやり過ぎかもしれません。
漏洩したセッション ID が永久に使用されないようにするため、またはショップに出かけた後に悪者が部屋に忍び込むのを防ぐために、セッションはタイムアウトを使用します。セキュリティ要件に応じて、10 分から 60 分の間で、妥当な短い時間で有効期限が切れるようにすることをお勧めします。ページを表示するたびにタイムアウトをリセットできるため、アクティブなユーザーがログアウトされることはありません。
ユーザーを記憶できるようにする (つまり、"remember me" チェックボックス) には、認証トークンとして機能する Cookie を提供する必要があります。このトークンは、すべての意図と目的において、パスワードを持つことと同じであることに注意してください。これは、悪意のある人物が Cookie を盗んだ場合、あなたのアカウントにログインできることを意味します。このオプションを安全にするために、ワンタイム トークンを使用できます。これらのトークンは、使い捨て、ランダム、ロング、シークレットである必要があります。それらをパスワードのように扱ってください。
それらを実装する方法は次のとおりです。
- ランダムなトークンを生成します。可能であれば使用
/dev/urandom
します。それ以外の場合は、mt_rand
十分に「ランダム」なものを取得するために数百の値が必要です。次に、結果の文字列を SHA1 でハッシュしてトークンを生成します。
- 強力なパスワード ハッシュ アルゴリズム (PBKDF2 や bcrypt など) を使用して、トークンのハッシュを作成します。この目的で SHA1 や MD5 を使用しないでください。これらはパスワードのハッシュ用に設計されたものではありません。
- ハッシュが属するユーザーの ID と作成日とともに、ハッシュをデータベース テーブルに挿入します。
- ユーザー側の Cookie にトークンを設定します。
- ユーザーがサイトにアクセスし、ログインせず、ログイン トークン Cookie が検出された場合、手順 2 で使用したのと同じアルゴリズムを使用して Cookie からトークン値をハッシュし、データベースで検索します。エントリと一致する場合は、その ID でユーザーをログインさせます。
- データベースからエントリを削除し、新しいエントリを発行します (ステップ 1 に戻ります)。
また、非常に古いセッション トークン (たとえば 3 か月以上) を探して削除するスクリプトを実行する必要があります。これにより、ユーザーは、長時間非アクティブになった後に戻ってきたときに、再度ログインする必要があります。
これに関するより長い説明と、安全な Web フォーム ログイン システムに関するより重要な情報については、The Definitive Guide to Forms-Based Website Authentication を読んで、OWASP プロジェクトを参照してください。