2012-08-05 13 views
5

私は、自分のウェブサイトにログインしたときに、ユーザーに「ログインしてください」という機能を持たせたいと考えています。この記事の一番上の答えである"Keep Me Logged In" - the best approachの提案で、ユーザーの塩とパスワードの組み合わせを1つのクッキーにハッシュし、ユーザーのID(数字)を別のクッキーに保存することに決めました。もちろん、ハッシュ値はデータベースサーバー側に格納され、ユーザーが再び戻るときに検証されます。私が使用した塩の値は、最初に登録したときにユーザーのパスワードをハッシュするのに使用したのと同じものなので、静的であり、セッション間では変更されません。この方法にはいくつか問題があります。機密データを含むクッキーをPHPに安全に保存するには?

1)登録塩は静的な場合や、毎回異なる塩を生成する必要がある場合は、良いアイデアですか?

2)誰かがクッキーにアクセスして別のコンピュータにコピーし、そのコンピュータからウェブサイトにアクセスしようとすると理論的に、そのユーザーのアカウントに自動的にログインします。セキュリティ上の問題?

3)悪質な意図を持つユーザーがデータベースにアクセスするシナリオでは、安全なWebサイトでは塩分とハッシュされたパスワードがあるため、ハッカーが複数のアカウントにアクセスすることは難しくなります。しかし、単純にハッシュ値とソルト値を使い、データベース上で変更した値と一致するクッキーを作成するだけで、必要な任意のアカウントに効果的にアクセスでき、パスワードハッシュ処理全体が役に立たなくなることがあります。したがって、私が今使っているこのクッキーのアプローチは、私のデータベース全体と私のすべてのユーザーのアカウントを傷つけています。

私の質問は、前述の問題を気にすることなく、ユーザーのパスワードのハッシュなどの機密情報を持つPHPでCookieを保存するにはどうすればよいですか?確かに、この「Keep me logged in」機能を提供するGmailやHotmailのようなWebサイトは、私が今やっていることよりも安全なアプローチに従っています。

答えて

9

ハッシュされたかどうかにかかわらず、パスワードをクッキーに保存しないでください。実際、クッキーに敏感なものを保存する理由はありません。 128ビット(またはそれ以上)のランダムIDをデータベースのユーザーアカウントにマップし、そのIDをCookieに格納するだけです。特にあなたがロックアウトをしている場合、誰かがリモートブルートフォースによって有効なIDを推測する方法はありません。

誰かがクッキーにアクセスして別のコンピュータにコピーしてから、そのコンピュータからウェブサイトにアクセスしようとすると理論上、自動的にそのユーザーのアカウントにログインします。セキュリティ上の問題?

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

より便利な解決策は、SSLを使用するために「remember me」クッキーを要求することです。そのようにすれば、ハッカーはプレーンテキストでCookieを見ることはなく、おそらくローカル攻撃が必要になるでしょう。 (もしそうなら、私のクッキーを思い出すことはおそらくユーザーの心配ではないでしょう)。

これらのユーザーは効果的に、必要なアカウントにアクセスして、パスワードハッシュ処理全体を役に立たなくすることができます。

はい、いいえ。私が記述した手法(ランダムID)を使用すると、「Remember me」クッキーを持つアカウントにしかアクセスできません。しかし、それは彼らがあなたのデータベースにアクセスできる場合、彼らは彼らが望むすべてのアカウントを強引にすることができます。パスワード自体が弱いと、塩漬けされたパスワードでさえローカルにクラックするのは簡単です。

また、「私を覚えている」ログインを半ログインとみなすこともできます。何かを買うためのアクセス、電子メールアドレスの変更などは、まだパスワードを入力する必要があります。メッセージボードに投稿するなどの無害な作業をパスワードなしで行うことができます。

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

簡潔に言えば、クッキーに敏感なものは保存せず、クッキーにはSSLを要求し、可能であればマルチファクタ認証を実装してください。特に管理者アカウントの場合。

+0

よろしくお願いいたします。だから、私はログインを覚えておくためのトークンを生成するためにuniqid()のようなものを使用します。データベースが侵害された場合、アカウントを攻撃するのがどれほど簡単かと私はまだ不安です。 「私を覚えている」メカニズムが含まれていないと、深刻な被害が発生する前に侵入と行動を検出する可能性がありますが、このソリューションでは瞬時に攻撃が行われます。 – hesson

+0

uniqid()はユニークではありませんが予測することは非常に難しいです。私はbase64でエンコードされた 'openssl_random_pseudo_bytes()'のようなものを使用したいと思います。あなたの懸念事項は有効ですが、再度、健全性チェックは広範な攻撃から保護します。たとえば、古いアカウントにログインしている新しいIPや、複数のアカウントにログインしているIPをたくさん取得した場合は、フラグを立ててください。 – Matthew

関連する問題