27

後で、ユーザーを正しくログアウトする方法を尋ねていましたが、Cookie のみを使用してユーザーをログイン状態に保つことはまったく安全ではないことがわかりました。

Cookie にパスワードを保持することは安全な方法ではないため、私の質問は、私の Web サイトで (ログイン/ユーザーのログイン状態を維持する) 正しい方法は何ですか?

現在、Xユーザープロファイルを表示するために必要なURLと同じユーザーIDと、MD5で暗号化された電子メールとパスワードを保存しています。

Setcookie は、ログインに成功したときに使用する唯一の関数です。私はセッションを使用して乱数を保存し、繰り返しフォームを送信しないようにしています。隠しフィールド。

• 正しく安全な方法を教えてください。
• それを行う方法は何ですか?

PHPのみ。php で 2 か月、すべてあなたの回答から学びました。ありがとう

4

5 に答える 5

36

まず、これを教えてください。100% 安全なものはありません。気密なものはなく、神聖なものはありません。十分な動機があれば、攻撃者はサーバー側の防御をすべて破ります (HTTPS を使用している場合を除きますが、これは別の話です)。

Cookie を使用することはできますが、Cookie は非常に公開されており、簡単に変更できます。個人データやアクセス レベルを Cookie に保存しないでください。攻撃者によって簡単に盗まれたり変更されたりするため。

セッションも 100% 安全ではありません。サーバーがクライアントを識別するために使用するセッション ID は、2 つの方法のいずれかで送信されます。$_GET 変数 (悪い)、または Cookie (より良いが、それでもかなり悪い)。つまり、セキュリティで保護されていない WiFi 経由で管理者としてログインしている場合、熟練した攻撃者 (つまり、単純な HTTP スニファーをダウンロードした pr0 haxx0r を意味します) は、SESSION ID を簡単に盗むことができます。また、パスワードを取得していない間、サーバーは攻撃者をあなたとして誤って識別し、あなたが持っている/持っていた可能性のあるアクセスを彼に許可します.

じゃあ何をすればいいの?ほとんどの場合、セッションは安全です。セキュリティで保護されていないネットワーク (バス、インターネット カフェなど) でログインしないようにユーザーにアドバイスします。ユーザー認証を長期間維持したい場合は、Cookie が必要です。必要に応じて、通常は 2 つの Cookie システムを使用します。

userid=12345
hash=password_hash($userid . $hashed_password, PASSWORD_DEFAULT)

次に、照合するものがありますが、ユーザーの詳細は明らかにされていません。


しかし、私が言ったように、結局のところ、本当にユーザーを保護したいのであれば、この回答に書かれている他のすべてのものに加えて、HTTPS を取得してください。

于 2012-05-12T20:25:46.320 に答える
9

セッションを使用します。

セキュリティを少し支援するために、ユーザーの資格情報が確認されたら、session_regenerate_idを使用します。セッション ID は Cookie で渡されるものであるため、ログインの処理中に誰かがスニッフィングしている場合、これは重要です。

アクセス資格情報に関連する情報をセッションに保存しないでください。多くの場合、userId で十分です。個人的には、セッションに保存するユーザー オブジェクトを作成します (これらはリクエスト間で自動的にシリアル化/非シリアル化されますが、独立して読み取ることができます)。

ユーザーが次回の訪問時にログインする必要がないようにCookieを設定したい場合は、おそらくuserIdと、データベースでチェックできる自動生成されたトークンを保存します(または同様のもの)-チェックにもエクストラを追加します-チェックするトークンとともに最後の IP アドレスを保存するなど、それらが一致しない場合は、もう一度ログインを要求します。

取ることができるかなりの数のアプローチがあります-私はすべて/「最高」を提供するわけではありません-あなたのコードをphpコミュニティの人々にレビューしてもらいます-あなたはその方法でより多くを学びます.

于 2012-05-12T20:17:44.343 に答える
5

ユーザーがログイン名とパスワードを持っている場合、これをブラウザーに Cookie として設定できるため、Web サイトにアクセスするたびに再ログインする必要がありません。ブラウザの Cookie にはほとんど何でも保存できます。問題は、ユーザーがいつでも Cookie をブロックしたり削除したりできることです。たとえば、あなたのウェブサイトのショッピング カートで Cookie が使用されていて、ユーザーのブラウザが Cookie をブロックするように設定されている場合、そのユーザーはあなたのウェブサイトで買い物をすることができません。

Cookie にデータを保存する場合、ユーザーがデータを改ざんできないことを完全に確認する必要があります。ユーザーが Cookie 内のデータを変更できないようにする方法はありません。それはとてつもなく簡単です。そのため、変更されたデータを含む Cookie を Web サイトが受け入れないようにするには、Cookie の値を暗号化するか、完全性を検証できるハッシュで署名する必要があります。

于 2012-05-12T20:49:25.530 に答える
2

@Madaraが言ったように、100%安全で正しいものは何もありませんが、開発者の観点からは、ユーザーのセッションデータを保持するすべての方法には、たとえば独自の長所と短所があると言えます.

Cookie とセッションのユーザー データ

ユーザーのセッション データを Cookie に保持している場合、ログに記録されたユーザーの情報を RAM に保持する必要がないため、サーバーの RAM メモリと処理の消費が少なくなります。また、ユーザーが増加した場合は、ユーザー セッション データをセッションではなく Cookie に保持することをお勧めします。これは、セッションを維持するとサーバー リソースが消費され、アプリケーションが遅くなり、応答しなくなる可能性があるためです。ユーザーのログインデータをセッションに保持しているかのように、Cookieよりも安全ですが、より多くのサーバーリソースを消費します。

最後 に、アプリケーションが HTTPS プロトコルを使用している場合、どちらの方法も独自の実装では正しいので、セキュリティは問題になりません。そのため、アプリケーションとビジネス モデルの要件に従って、ユーザーのセッション データを保持する方法を使用することをお勧めします。

于 2016-04-18T05:52:20.960 に答える