私は、自分のウェブサイトにログインしたときに、ユーザーに「ログインしてください」という機能を持たせたいと考えています。この記事の一番上の答えである"Keep Me Logged In" - the best approachの提案で、ユーザーの塩とパスワードの組み合わせを1つのクッキーにハッシュし、ユーザーのID(数字)を別のクッキーに保存することに決めました。もちろん、ハッシュ値はデータベースサーバー側に格納され、ユーザーが再び戻るときに検証されます。私が使用した塩の値は、最初に登録したときにユーザーのパスワードをハッシュするのに使用したのと同じものなので、静的であり、セッション間では変更されません。この方法にはいくつか問題があります。機密データを含むクッキーをPHPに安全に保存するには?
1)登録塩は静的な場合や、毎回異なる塩を生成する必要がある場合は、良いアイデアですか?
2)誰かがクッキーにアクセスして別のコンピュータにコピーし、そのコンピュータからウェブサイトにアクセスしようとすると理論的に、そのユーザーのアカウントに自動的にログインします。セキュリティ上の問題?
3)悪質な意図を持つユーザーがデータベースにアクセスするシナリオでは、安全なWebサイトでは塩分とハッシュされたパスワードがあるため、ハッカーが複数のアカウントにアクセスすることは難しくなります。しかし、単純にハッシュ値とソルト値を使い、データベース上で変更した値と一致するクッキーを作成するだけで、必要な任意のアカウントに効果的にアクセスでき、パスワードハッシュ処理全体が役に立たなくなることがあります。したがって、私が今使っているこのクッキーのアプローチは、私のデータベース全体と私のすべてのユーザーのアカウントを傷つけています。
私の質問は、前述の問題を気にすることなく、ユーザーのパスワードのハッシュなどの機密情報を持つPHPでCookieを保存するにはどうすればよいですか?確かに、この「Keep me logged in」機能を提供するGmailやHotmailのようなWebサイトは、私が今やっていることよりも安全なアプローチに従っています。
よろしくお願いいたします。だから、私はログインを覚えておくためのトークンを生成するためにuniqid()のようなものを使用します。データベースが侵害された場合、アカウントを攻撃するのがどれほど簡単かと私はまだ不安です。 「私を覚えている」メカニズムが含まれていないと、深刻な被害が発生する前に侵入と行動を検出する可能性がありますが、このソリューションでは瞬時に攻撃が行われます。 – hesson
uniqid()はユニークではありませんが予測することは非常に難しいです。私はbase64でエンコードされた 'openssl_random_pseudo_bytes()'のようなものを使用したいと思います。あなたの懸念事項は有効ですが、再度、健全性チェックは広範な攻撃から保護します。たとえば、古いアカウントにログインしている新しいIPや、複数のアカウントにログインしているIPをたくさん取得した場合は、フラグを立ててください。 – Matthew