题
多么独特的php session id?我得到的印象是从各种各样的事情,我已经阅读,我不应该依赖于两个用户从来没有得到同样的id.是不是一个GUID?
解决方案
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行):
-
客户
- IP地址
- 当前时间
- PHP线性同余生成器 - 伪随机数生成器(PRNG)
- 特定于操作系统的随机源 - 如果操作系统有可用的随机源(例如/ dev / urandom) 醇>
- 最小化生成具有相同值的两个会话ID的概率
- 使计算生成随机密钥并使用一个非常具有挑战性。 醇>
如果操作系统有可用的随机源,那么为了成为会话ID而生成的ID的强度很高( / dev / urandom和其他OS随机源(通常)是加密安全的PRNG )。但如果它没有那么它是令人满意的。
生成会话标识的目标是:
这是通过PHP的会话生成方法实现的。
你不能绝对保证唯一性,但概率很低,只能达到两次相同的哈希值,一般来说,不值得担心。
如果要自定义生成ID的方式,则可以安装备用哈希生成函数(默认情况下,它是通过MD5生成的128位数)。请参见 http://www.php.net/手动/ EN / session.configuration.php#ini.session.hash功能
有关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
这样的的概率的一个或更多的冲突少于一个在70万数十亿美元。因此128位的尺寸的session_id应当足够大。中提到的其他评论意见,session_manager可能还要检查新的session_id已经不存在。
随机性
因此,最大的问题,我认为是否session_id:s产生良好的伪随机性。在那你可以永远不能肯定,但我要建议使用一个众所周知的,并经常使用的标准解决方案用于这一目的(正如你可能已经做)。
甚至如果冲突是可以避免的由于检查、随机性和尺寸的session_id是重要的,这样,黑客可能不是,不知怎的,合格的猜测,并发现活性session_id:s与大概率。
不,会话ID不是GUID,但是两个用户不应该获得与服务器端存储的会话ID相同的会话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>
如果您的用户名不同或唯一,则可以将此代码用于会话