いつ、なぜsession_regenerate_id()を使用する必要があるのですか?


95

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


- :あなたは変数が存在しているセッションを開始するときに、セッションが開始した後に作成され、他のページにされているので
過酷な

@HaRsH Oo?Session_regenerate_idは、古いセッションIDを削除し、新しいIDを作成して、たとえばXSSによるセッションのハイジャックを回避します。他のドキュメントのSESSION変数の可視性には影響しません。
Xatenev 2014

はい、私は他の変数には影響がないことを知っていますが、そのページでセッションを開始しないと、変数はコアphpのそのページに存在しません
HaRsH

1
しかし、これは... session_regenerate_idについて、ではないのsession_startについてです
Xatenev

1
それが提案されたRFCを読むことをお勧めします:wiki.php.net/rfc/precise_session_management
jankal

回答:


96

なにsession_regenerate_id()

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

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

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

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

いつ使用すべきsession_regenerate_id()ですか?

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

参考文献:


2
そして、ハッカーが20回目の呼び出しを行った場合、何が追加されますか?セッションIDが変更され、セッションを所有するのは彼だけです;))
fred727

@ fred727ハッカーが20回目の呼び出しをヒットできるほど幸運である場合、ユーザーのIDは無効になり、認証されなくなります。再生なしでは、ハッカーとユーザーの両方が認証されます。
Bradmage 2016年

機密情報をセッションに保存するときに(認証遷移だけでなく)session_regenerate_idを呼び出すことも役立つ場合があります
Adam

セッション情報がcookieにない場合、セッションを固定することは可能ですか?サーバーのファイルにセッション情報を保存していますが、IDを再生成する必要がありますか?
ゴンザロ

「別のユーザーのセッションID(SID)を修正(設定)するには」 ....これは、「別のユーザーのコンピューターのセッションID(SID)を修正(設定)して、認証後に使用する」に置き換える必要があります。 」
会計士م

24

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

このSecurity.SEの回答から:

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

このウェブページから:

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

いつ使用するか

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

以下も参照してください。

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

セッションの固定(良い読み)


22

セッション中毒の問題はかなりよくカバーされていると思います。

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

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

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

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

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


2
HTTPSは固定に関して何も変更しません。
kelunik 2015

4
しかし、そもそもスニッフィング攻撃を難しくし、そもそもセッションIDを取得するために使用できます。
Demonkoryu 2016

私のphpアプリは数秒以内にログアウトし、再生成を使用しています。作成できるセッションファイルに制限はありますか、またはログアウトの原因となる可能性がある再生成されたIDに制限がありますか?
sqlchild '19

通常はありません。それについて別の質問を投稿したいかもしれません
Machavity

16

なぜ使用する必要があるのsession_regenerate_idですか?

セッションの固定を防ぐために使用してください。

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

認証状態が変化するときはいつでも、それは主にログインとログアウトです。

ボブは公共のコンピューターの前に座って、stackoverflow.comを閲覧することで、そこで新しいセッションを開きます。セッションIDはcookieに保存されます(httpOnlyJavaScriptを介したアクセスを防止するフラグ付き)。スタックオーバーフローでHTTPSが常に有効になっていsecureて、Cookieにフラグが設定されているとしましょう。

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

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

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


しかし、それがsession_regenerate_id()発行されるまで、アリスはボブスアカウントにアクセスできますか?そうですか?
Akam

2
@akam-遅いですが、応答する価値があります... 1.ボブはログアウトせず、アリスは彼のログインを使用できます-2.ボブはログアウトし、アリスはログインせず、アリスは彼のセッションIDを使用できますが、データにアクセスするためのアクティブなログインはありません-3.ボブがログアウトし、アリスがログインします。ボブはセッションIDを使用します。アクティブなログインがあり、ボブはアリスのデータにアクセスします。しかし具体的には、スクリプトのセキュリティに依存しているセッションIDは、必ずしもログアウトしたユーザーのデータにアクセスできることを意味するわけではありませんが、一般的に言って、それは可能であり、高いリスクです。
codekandis 2018

15

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

このようにして、1回限りのセッションIDを作成します。

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

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

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

session_start();
session_regenerate_id();

あなたは彼らがあなたのウェブサイトを使うたびに彼らのセッションを変えることができます。

今ハッカーはセッションID = 3を取得します

しかし、あなたは彼がそれを使用した後でセッションを変更しました。

user have sessionid = 4 // auth

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

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

この方法で上記で説明したように、クライアントを一方向のデータ盗聴から保護することができますが、この問題を完全に解決することはできません。

しかし、SSL encを使用すれば、はるかに安全です。

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


12

簡単な使用例:

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

セッションが開始され、データベースにエントリが作成されます。ユーザーのショッピングカートは、セッションIDで識別されます。

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

追加された製品ごとに、私の買い物かごのテーブルにレコードが作成されます。セッション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が再生成され、ユーザーは別のショップカートの作成をやり直すことができます。


4

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

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.