web-dev-qa-db-ja.com

session_regenerate_id()を使用するタイミングと理由は?

PHPでsession_regenerate_id()関数を使用する理由とタイミングsession_start()を使用した後、常に使用する必要がありますか?セッションの固定を防ぐために使用する必要があることを読みましたが、これが唯一の理由ですか?

84
rvandoni

session_regenerate_id()とは何ですか?

関数名が示すように、それは現在のセッションIDを新しいものに置き換え、現在のセッション情報を保持する関数です。

それは何をするためのものか?

主にセッション固定攻撃の防止に役立ちます。セッション固定攻撃は、悪意のあるユーザーがシステムの脆弱性を悪用して別のユーザーのセッションID(SID)を固定(設定)しようとする場所です。そうすることで、彼らは元のユーザーとして完全なアクセス権を取得し、認証が必要なタスクを実行できるようになります。

このような攻撃を防ぐには、ユーザーがサインインに成功したとき(またはXリクエストごとに)session_regenerate_id()を使用して新しいセッションIDを割り当てます。これで、彼だけがセッションIDを持ち、古い(固定)セッションIDは無効になります。

session_regenerate_id()はいつ使用する必要がありますか?

以下のコメントでsymbeceanが指摘しているように、セッションIDは認証状態のすべての遷移で変更する必要があり、only認証の移行時。

参考文献:

83
Amal Murali

セッションハイジャックおよびセッション固定を停止するには、session_regenerate_id()を使用する必要があります。

このSecurity.SEの答え から:

セッションハイジャックとは、セッションCookieを盗むことです。これは、ローカルネットワークを他のコンピューターと共有するときに最も簡単に実現できます。例えば。スターバックスで。例...セッションYのユーザーは、スターバックスでジェームズのWebサイトを閲覧しています。私は彼らのネットワークトラフィックを聞いて、ラテをすすります。 JamesのWebサイトのセッションYのCookieを持つユーザーを取得し、それらを使用するようにブラウザーを設定します。ジェームズのサイトにアクセスすると、ジェームズのサイトになります。

このWebページ から:

セッション固定は、ユーザーのセッションIDを明示的な値に強制する攻撃手法です。ターゲットWebサイトの機能に応じて、セッションID値を「修正」するために多くの手法を利用できます。これらの手法は、クロスサイトスクリプティングのエクスプロイトから、以前に作成されたHTTPリクエストでWebサイトをペッパー化するまでさまざまです。ユーザーのセッションIDが修正された後、攻撃者はそのユーザーがログインするのを待ちます。ユーザーがこれを行うと、攻撃者は定義済みのセッションID値を使用して同じオンラインIDを想定します。

使用する場合

ユーザーがサイトのセキュリティまたはプライバシーポリシーを侵害する可能性のある重要な入力(パスワード、資格情報の変更、パスワードを忘れたなど)を編集/更新しているとき。

こちらもご覧ください:

PHPセキュリティガイド:セッション

セッションの固定化(読みやすい)

21
Dimag Kharab

セッションポイズニングの問題はかなりよくカバーされていると思います。

「これをいつ使うべきですか?」一部、後戻りして、アプリケーションがセッションで何をしているかを考慮することが重要です。または、別の言い方をすれば、これは答える必要がある重要なセキュリティの質問です

誰かがこのセッションを手に入れた場合、彼らは何を得るでしょうか?

匿名データ(ユーザーがサイトにアクセスし、それを使用して訪問を追跡する)を追跡するだけであれば、セッションを再生成する理由はほとんどありません。ハイジャッカーは、そのセッションを取得しても価値のあるものは何も得られません。

ただし、多くのサイトがログインを提供しています。ログインは多くのことを変更します。プロフィールにアクセスできます。設定を変更できます。そのため、特に通常のユーザーと管理者のすべてのユーザーがログインを管理するためにセッションを使用する場合、ハイジャッカーは私のアカウントへのアクセスを必要とする場合があります。したがって、人々が私のサイトに来てログインすると、セッションが再生成されます。これにより、新たにログインしたユーザーがハイジャックされる可能性が低くなるというセキュリティのレイヤーが追加されます。

重要なデータをセッションに追加するときは、セッションIDの再生成を検討する必要があります。固定に対してアプリケーションを強化する必要がある場合は、ランダムな再生成が便利ですが、リクエストごとに再生成することはありません。デフォルトでは、PHPはセッションをローカルディスク上のファイルに保存します。比較的小さな攻撃ベクトルを緩和するために、大量のディスクI/Oを追加しています。より多くのセキュリティが本当に必要な場合は、完全なHTTPSを定期的に再生成することをお勧めします(HTTPSでは固定が非常に困難になります)。

17
Machavity

session_regenerate_idを使用する理由

セッション固定 を防ぐために使用する必要があります。

いつsession_regenerate_idを使用すべきですか?

認証状態が変わるたびに、それは主にログインとログアウトになります。

ボブは公共のコンピューターの前に座って、stackoverflow.comを閲覧することで新しいセッションを開きます。セッションIDはCookieに保存されます(javascriptを介したアクセスを防ぐためにhttpOnlyフラグを使用)。 Stack OverflowでHTTPSが常に有効になっており、Cookieにsecureフラグが設定されているとしましょう。

どうすればセッションを盗むことができますか?

ボブはセッションIDを書き留めます。彼はブラウザーを閉じずにコンピューターを離れます。これで、アリスはこのコンピューターにアクセスし、スタックオーバーフローが既に読み込まれていることを確認します。彼女は今ログインしています。

これで、session_regenerate_idを使用する段階になりました。ログイン中にここで新しいセッションIDを作成しない場合、ボブは書き留めた以前のセッションを使用してアリスのセッションにアクセスし、現在はアリスとしてログインします。

12
kelunik

簡単な使用例:

// User visits a webshop
$shopcart = new Cart();

セッションが開始され、データベースにエントリが作成されます。ユーザーの買い物かごは、セッションIDによって識別されます。

// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);

追加された製品ごとに、shopcartテーブルにレコードが作成されます。セッションIDによっても識別されます。

// User saves cart in order to use it later
$shopcart->save();

ユーザーはカートを保存することにしました。現在、ユーザーIDに添付されています。

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();

セッションIDが再生成され、ユーザーは別のショップカートの作成をやり直すことができます。

11
Peter

セキュリティを強化するために使用できます。

この方法で、1回限りのセッションIDを作成します。

あなたのユーザーセッションIDは= 3だとしましょう

一部のハッカーがあなたのクライアントをハッキングし、彼らのsession_idを取得しました。そのため、ハッカーはそのCookieを使用してセッションを使用できます。

次のようなコードがある場合

session_start();
session_regenerate_id();

ウェブサイトを使用するたびにセッションを変更できます。

ハッカーはsessionid = 3を取得します

しかし、彼がそれを使用した後にセッションを変更したので、

ユーザーはsessionid = 4を持っています//認証

ハッカーはsession = 3 // nullを持っています

ただし、再生成メソッドを使用していて、クライアントがWebサイトにログインしてブラウザーを閉じるか、非アクティブにするだけのことを言うことができます。クライアントのセッションIDは4であり、ハッカーがその部分でCookieを取得すると、同じセッションIDになります。

この方法で上記で説明したように、一方向でのデータスニッフィングからクライアントを保護できますが、それでもこの問題を解決することはできません。

ただし、SSL encを使用する場合は、はるかに安全です。

悪い英語でごめんなさい。

11

session_regenerate_id():セッションIDを再生成できません-セッションはアクティブではありません

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
4
Anton