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によってシードされたDFA乱数ジェネレーターがあり、usecsの時間と混合されています。これは、特にセキュリティの観点から見た場合、一意の一意性条件ではありません。上記のエントロピー設定を使用します。
更新:
PHP 5.4.0以降、session.entropy_fileのデフォルトは/ dev / urandomまたは/ dev / arandomです(使用可能な場合)。PHP 5.3.0では、このディレクティブはデフォルトで空のままです。PHPマニュアル
PHPがデフォルトでセッションIDを生成する方法を知りたい場合は、Githubのソースコードを確認してください。これは確かにランダムではなく、これらの成分のハッシュ(デフォルト:md5)に基づいています(コードスニペットの310行目を参照)。
OSに使用可能なランダムソースがある場合、セッションIDを目的として生成されたIDの強度は高くなります(/ dev / urandomおよび他のOSランダムソースは、(通常)暗号的に安全なPRNGです)。しかし、そうでない場合は問題ありません。
セッション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未満です。したがって、128ビットのサイズのsession_idで十分です。他のコメントで述べたように、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>
ユーザー名が異なる場合や一意の場合は、このコードをセッションに使用できます