私はコメントの中で言われたすべてをひとつの答えにまとめるつもりです。そのように、他の有益なユーザーに、彼らの回答/コメントをアップアップすることによっていくつかの愛を示してください!セッションの仕組みを簡単に紹介し、より多くのユーザーに役立てるための解答を行います。
ユーザーがWebサイトにログインすると、そのユーザーを識別するためのセッションが作成されます。セッションは、セッションIDを作成し、そのIDをサーバ側の変数ストアに関連付けて、PHPスクリプトで$_SESSION
スーパーグローバルを使用してアクセスすることで、PHPで処理されます。セッションIDは、クライアント側のクッキーに格納され、セッションを識別します。
セキュリティを確保するために、セッションIDは一意で、ランダムで、かつ秘密でなければなりません。攻撃者がセッションIDを推測すると、同じIDを使用して自分のコンピュータにCookieを作成し、セッションを引き継ぐことができます。彼らはあなたとしてログインします!これは明らかに悪いので、PHPは強力な乱数ジェネレータを使用してセッションIDを作成します。物事をより安全にするために、サイト全体でSSLを有効にして、HTTPS専用フラグを使用してSSL経由でCookieを送信するようにブラウザに通知することができます。しかし、これはあなたのサイトにとって過度のものかもしれません。
セッションに漏れたセッションIDが永遠に役に立たないようにするため、または店に出た後に悪質な人があなたの部屋に潜入するのを防ぐために、セッションはタイムアウトを使用します。合理的な短期間(セキュリティ要件に応じて10分から60分の間)に有効期限を切ることをお勧めします。アクティブなユーザーがログアウトしないように、ページを表示するたびにタイムアウトをリセットすることができます。
ユーザを覚えておくためには、認証トークンとして機能するCookieを提供する必要があります。このトークンは、すべての目的と目的のために、パスワードを持つことと同じであることに注意してください。つまり、悪意のある人がクッキーを盗むと、あなたのアカウントにログインできます。このオプションを安全にするために、ワンタイムトークンを使用できます。これらのトークンは、使い捨てで、ランダムで、長く、秘密でなければなりません。それらがパスワードであるかのように扱います!
は、ここでそれらを実装する方法は次のとおりです。
- ランダムなトークンを生成します。可能であれば
/dev/urandom
を使用してください。それ以外の場合は、mt_rand
から数百の値を取得して、「ランダム」なものを取得し、結果の文字列をSHA1でハッシュしてトークンを生成してください。
- 強力なパスワードハッシュアルゴリズム(PBKDF2またはbcryptなど)を使用して、トークンのハッシュを作成します。この目的のためにSHA1またはMD5を使用しないでください - パスワードをハッシュするようには設計されていません!
- ハッシュをデータベーステーブルに、それが所属するユーザーのIDと作成日と一緒に挿入します。
- ユーザー側のCookieにトークンを設定します。
- ユーザーがサイトにアクセスし、ログインしていないときにログイントークンクッキーが検出された場合は、手順2で使用したのと同じアルゴリズムを使用してクッキーからトークン値をハッシュし、データベースで検索します。エントリと一致する場合は、そのIDでユーザーをログインします。
- データベースからエントリを削除し、新しいエントリを発行します(手順1に戻る)。
非常に古いセッショントークン(3か月以上など)を探して削除するスクリプトも実行する必要があります。これにより、長期間使用しないと戻ってくると、ユーザーは再度ログインする必要があります。
これ以上の説明と安全なウェブフォームログインシステムに関する多くの重要な情報については、The Definitive Guide to Forms-Based Website Authenticationを読んでOWASP projectをご覧ください。
セッションを使用し、セッションの有効期限を長くします。 – Dhruvisha
[フォームベースのウェブサイト認証のための完全なガイド](http://stackoverflow.com/questions/549/the-definitive-guide-to-forms-based-website-authentication)を読むことを強くお勧めします。 – Polynomial