web-dev-qa-db-ja.com

PHPセッションIDはどのくらいユニークですか

PHPセッションIDはどのくらい一意ですか?私が読んださまざまなことから、2人のユーザーが同じセッションIDを取得しないことに頼るべきではないという印象を受けました。 GUIDではありませんか?

89
Jalov

Session_idは実際に複製できますが、確率は非常に低いです。公正なトラフィックのウェブサイトを持っている場合、それはあなたのウェブサイトの生活の中で一度起こるかもしれません。

これは、非常にトラフィックの多いWebサイトや銀行業界向けのサービスを構築する予定がない限り、気にする価値はありません。

37
e-satis

出荷時ほどユニークではありません。デフォルトの構成では、gettimeofdayの結果を含むさまざまなもののハッシュの結果です(これは非常に一意ではありません)が、心配な場合は、/ dev/urandomからエントロピーを引き出すように構成する必要があります。

ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");

コード で「php_session_create_id」を検索して、使用している実際のアルゴリズムを探します。

追加して編集:pidによってシードされたDFA乱数ジェネレーターがあり、usecsの時間と混合されています。確かな一意性条件ではありません 特にセキュリティの観点から 。上記のエントロピー設定を使用します。

更新:

PHP 5.4.0 session.entropy_fileは、デフォルトで/ dev/urandomまたは/ dev/arandomが利用可能であれば、このディレクティブ。PHP 5.3.0このディレクティブデフォルトでは空のままです PHP Manual

66
djsadinoff

PHPデフォルトでセッションIDを生成する方法を知りたい場合は、 Github のソースコードを確認してください。これは確かにランダムではなく、ハッシュに基づいています(デフォルト:md5)これらの成分(コードスニペットの310行目を参照):

  1. クライアントのIPアドレス
  2. 現在時刻
  3. PHP線形合同ジェネレーター-擬似乱数ジェネレーター(PRNG)
  4. OS固有のランダムソース-OSに使用可能なランダムソースがある場合(例:/ dev/urandom)

OSに使用可能なランダムソースがある場合、セッションIDを目的として生成されたIDの強度は高く(/ dev/urandomであり、他のOSランダムソースは(通常)暗号的に安全なPRNGです)。しかし、そうでない場合は満足です。

セッションID生成の目標は次のとおりです。

  1. 同じ値を持つ2つのセッションIDを生成する確率を最小限に抑える
  2. ランダムキーを生成し、使用中のキーをヒットすることを計算上非常に困難にします

これは、セッション生成に対するPHPのアプローチによって実現されます。

一意性を完全に保証することはできませんが、同じハッシュを2回ヒットする確率は非常に低いため、一般的には心配する価値はありません。

12
GordyD

IDの生成方法をカスタマイズする場合は、代替のハッシュ生成関数をインストールできます(デフォルトではMD5を介して生成される128ビットの数値です)。 http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function を参照してください

PHPセッションについては、この優れた記事をお試しください http://shiflett.org/articles/the-truth-about-sessions 他の記事にもリンクしていますセッション固定とハイジャックについて。

11
Paul Dixon

session_idのサイズ
seesion_idは均一に分散され、size = 128ビットであると仮定します。地球上のすべての人が1日1回ログインし、1000年にわたって新しいセッションが持続すると仮定します。

num_sesion_ids  = 1000*365.25 *7*10**9 < 2**36
collission_prob < 1 - (1-1/2**82)**(2**36)  ≈ 1 - e**-(1/2**46) 
                ≈ 1/2**46 

したがって、1つ以上の衝突の可能性は70千億に1未満です。したがって、session_idの128ビットサイズは十分に大きくなければなりません。他のコメントで述べたように、session_managerは、新しいsession_idがまだ存在していないことも確認する場合があります。

ランダム
したがって、大きな疑問は、session_id:sが良好な擬似ランダム性で生成されるかどうかです。その点については確信が持てませんが、この目的のために、よく知られた、頻繁に使用される標準ソリューションを使用することをお勧めします(おそらく既にそうです)。

チェックのために衝突が回避された場合でも、ハッカーはセッションIDのランダム性とサイズが重要であるため、ハッカーは何らかの形で適切な推測を行い、アクティブなセッションIDを大きな確率で見つけることができません。

5
MrJ

私はこれに関する確認を見つけていませんが、そのIDを持つセッションIDを作成する前にPHPがセッションIDがすでに存在するかどうかをチェックすると信じています。

人々が心配しているセッションハイジャックの問題は、誰かがアクティブなユーザーのセッションIDを見つけたときです。これはさまざまな方法で防ぐことができます。詳細については、php.netで このページ および セッション固定に関するこのペーパー を参照してください。

3
Ólafur Waage

いいえ、セッションIDはGUIDではありませんが、2人のユーザーはサーバー側に保存されているため、同じセッションIDを取得しないでください。

2
gizmo