web-dev-qa-db-ja.com

誰かが偽のAをできるかPHPセッション変数

ユーザーがアカウントを作成してログインできるサイトがあります。ユーザーがログインしたときに、ユーザーのパスワードとユーザー名を検証した後、ユーザーにPHPセッション変数にユーザー名を含めます。それが、ブログ投稿の作成やユーザーの経歴の変更など、私のサイトの機能にアクセスする方法です。

他の人のアカウントを介して私のサイトにアクセスしたい人は、ユーザーのユーザー名を含むセッション変数を偽造できますか?もしそうなら、彼らはどのようにこれを行うことができますか?そして、これを防ぐ方法はありますか?

4
DMVerfurth

いいえ。セッションデータはサーバーに保存されます。

セッションIDは、クライアントとサーバーの間で転送および転送される唯一のものです。したがって、サーバーがハッキングされたりサーバー側にバグがある場合を除き、クライアントはセッションデータを直接変更できません。 あなたの場合、セッション変数のユーザー名がセッションIDの一部であるか、それが置き換えられているようです(これは少し不明確です)。

これは、有効なクライアントだけがセッションIDを知っていることをシステムが保証する必要がないことを意味しません。これが、クライアントを特定のセッションにリンクするためです。そのため、ログインを試行するたびにsession_regenerate_id()関数を使用する必要があります。これは セッション固定 を防ぎます。

5
Overmind

ログインが成功した後に発行されたPHPセッションIDはサーバー側で生成され、ランダムなデータのみが含まれます。セッションIDはCookieとして送信され、クライアントからの後続のすべてのリクエストに含まれます。

セッションデータはサーバーに格納され、セッションIDは各要求のこのデータを参照するために使用されます。 PHP sessionidは安全と見なされます。

これは常にそうであったわけではありません。以前のバージョンのPHPでは、セッションIDはランダムでしたが、ランダムジェネレーターはサーバーの現在時刻、リモートアドレス、およびプロセスIDによってのみシードされました。攻撃者がランダムジェネレーターの状態を把握できると、攻撃者は以前と将来のセッションIDを予測できます。参照 http://seclists.org/fulldisclosure/2010/Mar/519

これにより、攻撃者が他のユーザーのセッションを盗むことが可能になりました。

それ以来、何が起こったかというと、PHPは、古い弱世代に加えて、Linuxシステムの/ dev/urandomなどの優れたランダムソースから32バイトをフェッチします。

2