4

PHP マニュアルでセッションの脆弱性について読み、この問題に遭遇しました。ユーザーの認証に成功した後、セッション ID を生成するにはサーバー/コードが必要です。

今、phpがいつセッションIDを設定するのかわかりません。私のphpアプリケーションはMVCに似ており、すべてがindex.phpを通過し、index.phpの上部には、(ログイン後の)すべてのページがセッションを使用するため、session.start()があります。

これは脆弱性のリスクですか? または、次のように表現する必要があります: これは、私のサイトへの最初の到着時に、ログイン前であっても、サーバーがそのユーザーのセッション ID を設定することを意味しますか? session.start() はユーザー ID を設定しますか、それとも最初のセッション変数を設定するまで生成されないセッション ID ですか。$_SESSION['foo']='bar' を実行するまでは?

セッションが実際に session.start() で既に生成されている場合、認証後にセッション ID を再生成することをお勧めします。その場合、問題は解決しますか?

4

3 に答える 3

5

を実行すると、セッションIDが生成されますsession_start()

ベストプラクティスは、を使用してログイン時にセッションIDを更新することsession_regenerate_id()です。

于 2011-05-12T09:50:57.067 に答える
4

session_startが呼び出され、有効なセッション ID が渡されなかった場合、PHP は新しいセッション ID を生成します。したがって、あなたの場合、ユーザーはログインフォームページにアクセスしたときにセッション ID を既に取得しています。

これは一般にセキュリティ上の脆弱性ではありませんが、アプリケーションがセッション固定に対して脆弱な場合に発生する可能性があります。それを避けるために、いくつかの対策があります。認証に関して最も重要なことは、新しいセッション ID を生成し、古いセッション ID を無効にすることです。session_regenerate_idセッションにユーザー情報を保存する前に呼び出すことで、これを行うことができます。

if ($userIsAuthentic) {
    session_regenerate_id(true);
    $_SESSION['user-id'] = 12345;
    /* … */
}
于 2011-05-12T10:58:52.723 に答える
1

または、次のように言う必要があります。これは、ログイン前であっても、サイトに最初にアクセスしたときに、サーバーがそのユーザーのセッションIDを設定することを意味しますか?

はい、そうです。

認証後にセッションIDを再生成することをお勧めします。その場合、問題は解決しますか?

あなたは正しいです。

session.start()はユーザーIDを設定しますか、それとも最初のセッション変数を設定するまでセッションIDは生成されません...

いずれにせよ、ユーザーログイン時にセッションIDを再生成することは基本的に何の費用もかかりません。また、ログインしていない$_SESSIONユーザーに変数を設定しなくても、何らかの理由で将来そうすることにした場合は補償されます。

于 2011-05-12T09:49:52.613 に答える