PHPセッションIDはどのくらい一意ですか? 私が読んださまざまなことから、2人のユーザーが同じセッションIDを取得しないことに依存するべきではないという印象を受けました。GUIDじゃないの?
10 に答える
出荷時はあまりユニークではありません。デフォルトの構成では、gettimeofday の結果を含むさまざまなもののハッシュの結果 (これは非常にユニークではありません) ですが、心配な場合は、次のように /dev/urandom から何らかのエントロピーを引き出すように構成する必要があります。
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
彼らが使用している実際のアルゴリズムのコードで「php_session_create_id」を検索してください。
追加するために編集: pid によってシードされ、usecs の時間と混合された DFA 乱数ジェネレーターがあります。特にセキュリティの観点からは、確固たる一意性条件ではありません。上記のエントロピー構成を使用します。
アップデート:
PHP 5.4.0 以降、session.entropy_file のデフォルトは /dev/urandom または /dev/arandom (利用可能な場合) です。PHP 5.3.0 では、このディレクティブはデフォルトで空のままです。PHP マニュアル
確かに、Session_id は重複する可能性がありますが、その可能性は非常に低くなります。公平なトラフィックの Web サイトを持っている場合、Web サイトの寿命の中で 1 回発生する可能性があり、1 回のセッションで 1 人のユーザーを悩ませるだけです。
これは、非常にトラフィックの多い Web サイトや銀行業界向けのサービスを構築する予定がない限り、気にする価値はありません。
PHP がデフォルトでセッション ID を生成する方法を知りたい場合は、Githubのソース コードをチェックしてください。これは確かにランダムではなく、これらの成分のハッシュ (デフォルト: md5) に基づいています (コード スニペットの 310 行を参照)。
- クライアントのIP アドレス
- 現在の時刻
- PHP Linear Congruence Generator - 疑似乱数ジェネレーター (PRNG)
- OS 固有のランダム ソース- OS に利用可能なランダム ソースがある場合 (例: /dev/urandom)
OS に利用可能なランダム ソースがある場合、セッション ID として生成される ID の強度は高くなります ( /dev/urandom およびその他の OS ランダム ソースは (通常) 暗号的に安全な PRNG です)。そうでない場合は、満足のいくものです。
セッション ID 生成の目的は次のとおりです。
- 同じ値を持つ 2 つのセッション ID が生成される可能性を最小限に抑える
- ランダムなキーを生成し、使用中のキーをヒットすることは、計算上非常に困難です。
これは、セッション生成に対する PHP のアプローチによって実現されます。
一意性を完全に保証することはできませんが、同じハッシュを 2 回ヒットする可能性は非常に低いため、一般的に言えば、心配する価値はありません。
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を試してください。この記事には、セッション固定とハイジャックに関する他の記事へのリンクも含まれています。
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回以上の衝突の確率は7万分の1未満です。したがって、session_idの128ビットサイズは十分な大きさである必要があります。他のコメントで述べられているように、session_managerは、新しいsession_idがまだ存在していないことも確認する場合があります。
ランダム性
したがって、私が思う大きな問題は、session_id:sが適切な疑似ランダム性で生成されているかどうかです。その点については確信が持てませんが、この目的のために、よく知られていて頻繁に使用される標準ソリューションを使用することをお勧めします(おそらくすでに行っているように)。
チェックによって衝突が回避されたとしても、session_idのランダム性とサイズは重要であるため、ハッカーは資格のある推測を行って、アクティブなsession_id:sを高い確率で見つけることができません。
これに関する確認は見つかりませんでしたが、php はセッション ID を作成する前にその ID が既に存在するかどうかを確認していると思います。
人々が心配しているセッション ハイジャックの問題は、誰かがアクティブ ユーザーのセッション ID を見つけたときです。これは多くの方法で防ぐことができます。詳細については、php.net のこのページと、セッション固定に関するこのペーパーを参照してください。
いいえ、セッション ID は GUID ではありませんが、サーバー側に保存されているため、2 人のユーザーが同じセッション ID を取得することはできません。