php会话ID有多独特?我从阅读过的各种东西中得到的印象是,我不应该依赖永远不会获得相同sessionid的两个用户。它不是GUID吗?
Answers:
Session_id确实可以复制,但是概率很低。如果您的网站访问量比较合理,则可能会在您的网站生命中发生一次,并且只会使一个会话的用户烦恼。
除非您期望为银行业建立一个流量很高的网站或服务,否则这是不值得关注的。
它并不是很独特。在默认配置中,它是各种事物的散列的结果,包括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)。如果不是这样,那就令人满意了。
会话标识生成的目标是:
这是通过PHP的会话生成方法来实现的。
您不能绝对保证唯一性,但是两次击中相同哈希的概率很低,通常来说,这是不值得担心的。
如果要自定义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是均匀分布的,并且大小为128位。假设地球上的每个人每天登录一次,并持续进行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
因此,一次或多次碰撞的可能性小于7万亿次。因此,session_id的128位大小应该足够大。如其他注释中所述,session_manager可能还会检查新的session_id不存在。
随机性
因此,我认为最大的问题是session_id:s是否以良好的伪随机性生成。关于这一点,您永远不能确定,但是我建议为此目的使用一种众所周知且经常使用的标准解决方案(就像您可能已经做过的那样)。
即使通过检查避免了冲突,session_id的随机性和大小也很重要,因此黑客无法以某种方式进行合格的猜测并以很高的概率找到活动的session_id:s。
不,会话ID不是GUID,但是两个用户不应获得与存储在服务器端相同的会话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>
如果您的用户名不同或唯一,则可以使用此代码进行会话