6

ユーザーが自分の Web サイトにログインするときに、「ログイン状態を維持する」機能を使用できるようにしたいと考えています。この投稿のトップの回答である"Keep Me Logged In" - the best approachの提案で、ユーザーのソルトとパスワードの組み合わせを 1 つの Cookie にハッシュし、ユーザーの ID (数値) を別の Cookie に保存することにしました。もちろん、ハッシュ値はデータベースサーバー側にも保存され、ユーザーが再び戻ったときに検証されます。私が使用したソルト値は、ユーザーが最初に登録したときにユーザーのパスワードをハッシュするために使用したものと同じであるため、静的であり、セッション間で変化しません。このアプローチにはいくつかの問題があります。

1)登録ソルトが静的である場合、またはCookieに対して毎回異なるソルトを生成する必要がある場合、登録ソルトを使用することは良い考えですか?

2) 誰かが Cookie にアクセスして別のコンピューターにコピーし、そのコンピューターから Web サイトにアクセスしようとすると、理論的には、そのユーザーのアカウントに自動的にログインしますが、これはセキュリティ上の問題ではありませんか?

3) 悪意のあるユーザーがデータベースへのアクセスを取得するシナリオでは、安全な Web サイトはソルト化およびハッシュ化されたパスワードを使用しているため、ハッカーが複数のアカウントにアクセスすることは (仮にあったとしても) 困難になります。しかし、ハッシュ値とソルト値をいじって、データベースで変更した値と一致する Cookie を作成するだけで、必要なアカウントに効果的にアクセスでき、パスワードハッシュプロセス全体が役に立たなくなります。したがって、私が現在使用しているこの Cookie アプローチは、データベース全体とすべてのユーザーのアカウントを危険にさらしています。

私の質問は、前述の問題を心配することなく、ユーザーのパスワードのハッシュなどの機密情報を含む Cookie を PHP に保存するにはどうすればよいですか? この「ログイン状態を維持する」機能を提供する Gmail や Hotmail などの Web サイトは、私が現在行っている方法よりも安全なアプローチに従っているに違いありません。

4

1 に答える 1

11

ハッシュ化されているかどうかにかかわらず、パスワードを Cookie に保存しないでください。実際、機密情報を Cookie に格納する理由はありません。必要なのは、128 ビット (またはそれ以上) のランダム ID をデータベースのユーザー アカウントにマップし、その ID を Cookie に保存することだけです。特にロックアウトが設定されている場合は、誰かがリモートの力ずくで有効な ID を推測する方法はありません。

誰かが Cookie にアクセスして別のコンピューターにコピーし、そのコンピューターから Web サイトにアクセスしようとすると、理論的には、そのユーザーのアカウントに自動的にログインしますが、これはセキュリティ上の問題ではありませんか?

はい。それがこの機能の欠点です。ただし、Web サイトが新しい IP アドレス (特に異なる国からのもの) を検出し、2 番目のステップ (モバイル デバイスにコードを送信するなど) が必要な場合は、パスワードの盗難という一般的な問題とともに、この問題に対処する必要があります。(これはもちろん、安全でない公衆 Wi-Fi などのローカル ネットワークへの攻撃を防ぐのには役立ちません。)

より便利な解決策は、SSL を使用するために「remember me」Cookie を要求することです。そうすれば、ハッカーは平文で送信された Cookie を見ることができず、ローカル攻撃が必要になる可能性があります。(もしそうなら、remember me cookie はおそらくユーザーの懸念事項の中で最も少ないものです。)

必要なアカウントに効果的にアクセスできるため、パスワードハッシュプロセス全体が役に立たなくなります。

はいといいえ。私が説明した手法 (ランダム ID) を使用すると、「remember me」Cookie を持つアカウントにのみアクセスできます。しかし、そうは言っても、彼らがあなたのデータベースにアクセスできれば、彼らは好きなアカウントをブルート フォースできます。パスワード自体が弱い場合は、ソルトされたパスワードでもローカルで簡単にクラックできます。

また、「remember me」ログインを半ログインと見なすこともできます。何かを購入したり、メールアドレスを変更したりするためのアクセスには、依然としてパスワードの入力が必要です。メッセージ ボードへの投稿などの無害な操作は、パスワードがなくても実行できます。

最後に、PHP セッション Cookie は一時的な「remember me」トークンにすぎないことに注意してください。これの多くは、セッション ハイジャックの概念に当てはまります。「remember me」トークンは、より大きなチャンスの窓を追加するだけです。

つまり、Cookie に機密情報を保存せず、Cookie に SSL を要求し、可能であれば多要素認証を実装します (特に管理者アカウントの場合)。

于 2012-08-05T06:15:55.217 に答える