php的会话id有多独特?从我读过的各种资料中,我得到的印象是不应该依赖于两个用户永远不会获得相同的sessionid。那它不是全局唯一标识符(GUID)吗?
默认情况下,它并不是非常独特。在默认配置中,它是各种东西的哈希结果,包括gettimeofday的结果(这并不是非常独特的),但如果您担心,应该将其配置为从/dev/urandom中提取一些熵,如下所示:
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
在 这段代码 中搜索 "php_session_create_id" 查看他们实际使用的算法。编辑以添加:有一个DFA随机数生成器,由pid(进程标识符)种子混合使用cs时间。它不是一个强制唯一条件,特别是从安全角度考虑。使用上面的熵配置。更新:从PHP 5.4.0开始,session.entropy_file默认为/dev/urandom或/dev/arandom(如果可用)。在PHP 5.3.0中,默认情况下该指令为空。参见PHP手册。Session_id可以被复制,但概率非常低。如果您有一个有着适中流量的网站,它可能只会在整个网站的生命周期内发生一次,并且仅会影响一个用户的一个session。
除非您打算建立一个非常高流量的网站或银行业务服务,否则这不值得关注。
session_id的大小
假设session_id是均匀分布的,大小为128位。假设地球上每个人每天都会登录一次,持续使用一个新的session,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
我知道这篇文章已经很旧了。然而,我在这里添加我的答案,因为我无法找到一个相关的解决方案来回答这个问题,即使我自己发布了一个类似的问题。然而,我从回复中得到了线索。对于那些感兴趣的人,算法和解决方案在这里解释。它使用会话和不同的cookie的组合。
简要算法如下:
使用自定义类'MySessionHandler'和DB进行会话处理
就在session_start之前,将cookie cookie_start_time设置为当前时间。此cookie的生命周期将与会话相同。两者都使用变量$this->cookieLifeTime来设置生命周期。
在会话'_write'中,我们将该值设置为与$this->cookieStartTime相同的db表字段cookie_start_time
在会话'_read'中,我们进行检查
如果($getRowsOfSession[0]['cookie_start_time'] != $this->cookieStartTime)。
如果返回true,表示这是一个重复的会话,用户将被重定向以销毁该会话,然后再次重定向开始新会话。(总共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>