0

重複の可能性:
PHPセッション固定/ハイジャック

私は$_SESSIONスーパーグローバルを頻繁に使用しています。

ただし、状況は次のようになります。

ユーザーがログに記録されたら、彼のID(MySQLテーブル)を追跡したいと思います。IDを簡単に挿入できます$_SESSION['id'] = $user_id;

結局のところ、私は自分のサイトのページ全体でその変数を使用できます。私の頭に浮かぶのは、ユーザーはIDをだまして別のIDにすることができるということです。単純な番号があることがわかったら、それを少し変更して何が起こるかを確認できます-データベース内のエントリの追加、削除、編集にユーザーIDが使用されるため、多くの問題が発生する可能性があるため、これを防ぎたいと思います。

session_regenerate_id()セッションをハイジャックから保護するのに十分ですか?

結論: Cookieはセッション識別子のみを保存します-すべての値はサーバー上にあり、クライアント側に渡されることはありません。 StackOverflowでのセッション固定/ハイジャックについて読む

4

3 に答える 3

1

私があなただったら、データベースにuser_idとsession_hashを格納するテーブルがあります。おそらくdate_expiresも同様です。次に、ユーザーがログインしたときに、IDとランダムなソルトに基づいてハッシュを作成し、それをデータベースとセッション変数に保存します。そうすれば、彼らが自分の側でその値を変更した場合、データベースに保存されている他の値と一致する可能性はほとんどありません。これに加えて、ユーザーが自分のアカウントで何らかの操作を実行する場合は、データベーステーブルでハッシュをチェックして実際のIDを取得し、通常どおりに操作を実行します。

于 2011-10-17T05:28:16.120 に答える
1

1つのオプションは、それをハッシュしてから、データベースで同じハッシュを使用することです。

例:

$_SESSION['id'] = md5($user_id);

$query = "SELECT * from database_table where md5(database_table.user_id) = " . $_SESSION['id'];
于 2011-10-17T05:30:03.730 に答える
1

ユーザーはにアクセスできません$_SESSION['id']。彼はあなたのサーバーに保持されている変数を変更することはできません(sessionドキュメントを参照)。

session_regenerate_id()別の目的があります。CookieのSIDをリセットします。これが、ユーザーとセッションを区別するハンドルです。確認するセカンダリ識別子(IPまたはユーザーエージェント文字列)がある場合にのみ使用するのが理にかなっています。主な目的は、古いセッションや交差するセッションを防ぐことです。繰り返しますが、マニュアルを参照してください。

于 2011-10-17T05:31:06.813 に答える