7

私のコードには、ログインしたユーザー名とユーザーIDにすばやくアクセスする必要がある多くのインスタンスがあります。私は現在クッキーを使用しています。これは安全ではありません。

セッションが解決策になると思いましたが、セッションは期限切れになります。

もう1つのオプションは、一意のトークンをCookieに保存してから、データベースに保存されているトークンと照合して、ログインしているユーザーデータを取得することです。これは最も安全な解決策ですが、これで私が目にする問題は、ログインしたユーザー名とユーザーIDが必要なコードが何度もありますが、常にクエリを実行するとリソースが不要になります(これは本当ですか?)

解決策は何ですか?

4

3 に答える 3

5

コメントで言われたことをすべて 1 つの回答にまとめようと思います。そのため、回答やコメントに賛成票を投じて、他の親切なユーザーに愛を示してください! また、セッションがどのように機能するかについての簡単な概要を説明し、回答をより多くの聴衆に役立つようにします.

ユーザーが Web サイトにログインすると、ユーザーを識別するためのセッションが作成されます。セッションは、セッション ID を作成し、その ID をサーバー側の変数ストアに関連付けることによって PHP で処理されます。これは、$_SESSIONスーパーグローバルを使用して PHP スクリプトでアクセスされます。セッション ID はクライアント側の Cookie に保存され、セッションを識別します。

セキュリティを維持するために、セッション ID は一意で、ランダムで、秘密でなければなりません。攻撃者がセッション ID を推測すると、同じ ID を使用して自分のコンピューターに Cookie を作成し、セッションを乗っ取ることができます。彼らはあなたとしてログインします!これは明らかに悪いことなので、PHP は強力な乱数ジェネレーターを使用してこれらのセッション ID を作成します。物事をより安全にするために、サイト全体で SSL を有効にし、HTTPS-only フラグを使用して SSL 経由でのみ Cookie を送信するようにブラウザに通知できます。ただし、これはサイトにとってやり過ぎかもしれません。

漏洩したセッション ID が永久に使用されないようにするため、またはショップに出かけた後に悪者が部屋に忍び込むのを防ぐために、セッションはタイムアウトを使用します。セキュリティ要件に応じて、10 分から 60 分の間で、妥当な短い時間で有効期限が切れるようにすることをお勧めします。ページを表示するたびにタイムアウトをリセットできるため、アクティブなユーザーがログアウトされることはありません。

ユーザーを記憶できるようにする (つまり、"remember me" チェックボックス) には、認証トークンとして機能する Cookie を提供する必要があります。このトークンは、すべての意図と目的において、パスワードを持つことと同じであることに注意してください。これは、悪意のある人物が Cookie を盗んだ場合、あなたのアカウントにログインできることを意味します。このオプションを安全にするために、ワンタイム トークンを使用できます。これらのトークンは、使い捨て、ランダム、ロング、シークレットである必要があります。それらをパスワードのように扱ってください。

それらを実装する方法は次のとおりです。

  1. ランダムなトークンを生成します。可能であれば使用/dev/urandomします。それ以外の場合は、mt_rand十分に「ランダム」なものを取得するために数百の値が必要です。次に、結果の文字列を SHA1 でハッシュしてトークンを生成します。
  2. 強力なパスワード ハッシュ アルゴリズム (PBKDF2 や bcrypt など) を使用して、トークンのハッシュを作成します。この目的で SHA1 や MD5 を使用しないでください。これらはパスワードのハッシュ用に設計されたものではありません。
  3. ハッシュが属するユーザーの ID と作成日とともに、ハッシュをデータベース テーブルに挿入します。
  4. ユーザー側の Cookie にトークンを設定します。
  5. ユーザーがサイトにアクセスし、ログインせず、ログイン トークン Cookie が検出された場合、手順 2 で使用したのと同じアルゴリズムを使用して Cookie からトークン値をハッシュし、データベースで検索します。エントリと一致する場合は、その ID でユーザーをログインさせます。
  6. データベースからエントリを削除し、新しいエントリを発行します (ステップ 1 に戻ります)。

また、非常に古いセッション トークン (たとえば 3 か月以上) を探して削除するスクリプトを実行する必要があります。これにより、ユーザーは、長時間非アクティブになった後に戻ってきたときに、再度ログインする必要があります。

これに関するより長い説明と、安全な Web フォーム ログイン システムに関するより重要な情報については、The Definitive Guide to Forms-Based Website Authentication を読んで、OWASP プロジェクトを参照してください。

于 2012-07-18T12:23:46.693 に答える
3

クライアントで必要ない場合は、そこに終わらないようにしてください。

userId は特定のコンピューターではなく、ログインしているユーザーに固有のものであるため、Cookie は適していないようです。

PHP での基本認証は通常、セッションで行われるため、userId をセッションに追加することもできます。

セッション時間が短すぎる場合は、セッション時間を増やしてください。

于 2012-07-18T11:46:43.417 に答える
-5

このような情報をデータベースに保存し、起動時にグローバル オブジェクト レジストリにユーザー オブジェクトを作成します。ユーザー オブジェクトは、ユーザー名や電子メールなどの情報を保持し、それらの情報を変更できるようにします。ログインステータス自体は、セッションと Cookie に保存されます。

于 2012-07-18T11:45:43.767 に答える