質問
PHPセッションIDはどのくらいユニークですか? 2人のユーザーが同じセッションIDを取得することは絶対にしないでください、と読んださまざまなことから印象を受けました。 GUIDではありませんか?
解決
Session_idは実際に複製できますが、確率は非常に低いです。公正なトラフィックのウェブサイトを持っている場合、それはあなたのウェブサイトの生活の中で一度起こるかもしれません。
これは、非常にトラフィックの多いWebサイトや銀行業界向けのサービスを構築する予定がない限り、気にする価値はありません。
他のヒント
出荷時ほどユニークではありません。デフォルトの構成では、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マニュアル
デフォルトでPHPがセッションIDを生成する方法を知りたい場合は、 Github 。確かにランダムではなく、これらの成分のハッシュ(デフォルト:md5)に基づいています(コードスニペットの310行目を参照):
- クライアントのIPアドレス
- 現在の時刻
- PHP線形合同ジェネレーター-擬似乱数ジェネレーター(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つ以上の衝突の可能性は70千億に1未満です。したがって、session_idの128ビットサイズは十分に大きくなければなりません。他のコメントで述べたように、session_managerは、新しいsession_idがまだ存在していないことも確認する場合があります。
ランダム
したがって、私が考える大きな問題は、session_id:sが良好な疑似ランダム性で生成されるかどうかです。そのことについては決して確信が持てませんが、この目的のために、よく知られ、頻繁に使用される標準ソリューションを使用することをお勧めします(おそらく既にそうです)。
チェックにより衝突が回避されたとしても、session_idのランダム性とサイズが重要であるため、ハッカーは何らかの形で適切な推測を行い、アクティブなsession_id:sを大きな確率で見つけることができません。
これに関する確認は見つかりませんでしたが、phpは、セッションIDが既に存在するかどうかを確認してから、そのIDを持つセッションIDを作成します。
人々が心配しているセッションハイジャックの問題は、誰かがアクティブなユーザーのセッションIDを見つけたときです。これはさまざまな方法で防止できます。詳細については、このページをご覧ください。 php.netおよびセッション修正に関するこの論文
いいえ、セッションIDはGUIDではありませんが、2人のユーザーはサーバー側に保存されているのと同じセッションIDを取得しないでください。
<?php
session_start();
<*>
ユーザー名が異なる場合や一意の場合、このコードをセッションに使用できます
SESSION['username']="username";
?>
<!DOCTYPE html>
<html>
<head>
<title>Update</title>
</head>
<body>
<table border="2">
<tr>
<th>Username</th>
<th>Email</th>
<th>Edit</th>
</tr>
<?php
$conn=mysqli_connect("localhost","root","","telephasic");
$q2="select * from register where username = '".<*>
ユーザー名が異なる場合や一意の場合、このコードをセッションに使用できます
SESSION['username']."'";
$run=mysqli_query($conn, $q2);
while($row=mysqli_fetch_array($run))
{
$name=$row[1];
$email=$row[2];
?>
<tr>
<td><?php echo $name; ?></td>
<td><?php echo $email; ?></td>
<td><a href="edit.php"> Edit </a></td>
</tr>
<?php } ?>
</table>
</body>
ユーザー名が異なる場合や一意の場合、このコードをセッションに使用できます