ログイン情報をCookieに保存することは、ユーザーが簡単に編集できるため、セキュリティ上のリスクがあることを読みました。私の質問は、私が保存するのがCookieのユーザー名とパスワードだけである場合、なぜそれが危険なのかということです。データベースから情報を取得する前に、パスワードとユーザー名が一致していることを確認するための簡単な認証スクリプトを作成した場合、なぜこれが危険なのでしょうか。Cookieを編集するユーザーは、アクセスするために一致する正しいユーザー名とパスワードを知っている必要があります。セッションが終了した後もユーザーがログインしたままでいられるように、これを行うことを計画しています。
2 に答える
ユーザー名とパスワードをCookieに保存すると、コンピューターにアクセスできる人なら誰でもアクセスできるようになります。
これはあまり安全ではありません。
いいえ、これを行わないでください。これは、それを回避するための最悪の方法です。
より良い解決策は次のとおりです。
- ユーザーにログインしてもらいます。
- ランダムトークンを生成します。つまり、次のようになります。
$token = md5( time() . rand() . $username );
- トークンは、ユーザーのID、およびログインに使用されたIPアドレスと一緒に、Cookieとデータベースに保存されます。
- セッションを開始します。
このようにして、セッションの有効期限が切れた場合でも、Cookie内のトークンを確認し、IPアドレスとともにデータベースに保存されているものと比較して、ユーザーの非対話型ログインを処理できます。
このようにすることで、次のようになります。
- サーバーの外部にユーザーの資格情報を保存しない。
- Cookieのハイジャックに対するベースライン保護を提供します。
また、タイムスタンプをトークンと一緒に保存し、ユーザーがログインしたくないマシンに永続的にログインしないように、30日や60日などの妥当な期間の後に有効期限を切る必要があります。また、ユーザーが自分のすべてのログイントークンを表示して無効にするためのオプションであるため、ユーザーは自分のアカウントのセキュリティに責任を持つことができます。
re:@Gumboのコメント:
私はあなたが何をするかについて少し曖昧だと思いますrand()
。ユーザーの名前と[サーバーの時計を介して]ログインした正確な秒数がわかっていても、に20億の可能な値が残りますrand()
。[私のシステムで]2^ 128の可能性があるMD5ハッシュを推測し始めたい場合、トークンと一緒にDBに格納されているのと同じIPアドレスを使用していない場合は、すべて意味がありません。
アイテムは、次の理由で頭のてっぺんから選ばれました。
$username
:したがって、トークンはユーザーごとに一意である必要があります。time()
:トークンは1秒あたり一意ですrand()
:トークンはかなりランダムですmd5()
:私はそれのように感じたので。MD5の16進文字列はコードで簡単に使用でき、このコンテキストでは可逆性が重要なポイントです。トークンの推測を難しくすることにのみ関心があります。
とsha512またはbcryptまたはI-don't-care-whatを使用mt_rand()
しますが、このコンテキストでは必要ないという事実は変わりません。