如何独特的是PHP的会话ID? 我从我读过,我不应该依赖于两个用户永远不会得到相同的SessionID各种事物的印象。 这难道不是一个GUID?
Answer 1:
SESSION_ID的确可以复制的,但概率是非常低的。 如果你有一个网站,一个公平的交通,它可以在你的网站生命周期内发生一次,只会惹恼一个用户对于一个会话。
这是不值得关心,除非你希望建立一个非常高流量的网站,或为银行业界的服务。
Answer 2:
这并不是因为发货非常独特。 在默认配置下它的各种事情,包括gettimeofday的结果(这还不是特别独特)的哈希的结果,但如果你担心,你应该配置它来绘制从/ dev / urandom的一些熵,像这样
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
搜索在“php_session_create_id” 的代码 ,因为他们正在使用的实际算法。
编辑补充:有一个DFA随机数发生器由PID播种,用微秒(usecs)时混合。 这不是一个公司的唯一条件从安全角度特别 。 使用熵的配置上面。
更新:
作为PHP 5.4.0 session.entropy_file默认的/ dev / urandom的或/ dev / ARANDOM的,如果它是可用的。 在PHP 5.3.0这个指令是左默认为空。 PHP手册
Answer 3:
如果你想知道如何PHP生成默认的会话ID检查出的源代码Github上 。 这当然不是随机的,是基于散列(默认:MD5),这些成分的(见代码片段的行310):
- 客户端的IP地址
- 当前时间
- PHP线性同余发生器 -一个伪随机数发生器(PRNG)
- 特定于操作系统的随机源 -如果OS具有可用的随机源(例如/ dev / urandom的)
如果OS具有可用的随机源然后被会话ID的目的所产生的ID的强度高( 的/ dev / urandom的和其他OS随机源(通常)加密的安全的PRNG)。 然而,如果它不那么令人满意。
与会话身份生成的目标是:
- 最小化产生两个会话ID具有相同值的概率
- 使它非常具有挑战性的计算,生成随机密钥,并使用一个打一个 。
这是由PHP的方法来产生会话实现。
你不能绝对保证唯一性 ,但概率是如此之低命中相同的哈希的两倍,这是,一般来说,不值得担心的。
Answer 4:
如果您想自定义生成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这也链接到有关会话固定和劫持的其他文章。
Answer 5:
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
因此,一个或多个碰撞的概率小于一个在70000个亿。 因此,SESSION_ID的128位大小应该是足够大的。 正如在其他评论中提到,该SESSION_MANAGER也可以检查新的session_id已经不存在。
随机性
因此,最大的问题,我认为是SESSION_ID是否:■与良好的伪随机生成的。 在你不能确定,但我会建议使用用于此目的的众所周知的,经常使用的标准溶液(如你可能已经这样做)。
即使碰撞避免因检查,随机性和SESSION_ID的大小是很重要的,让黑客无法,以某种方式做合格的猜测,并找到积极的SESSION_ID:s的概率较大。
Answer 6:
我还没有找到这样的确认,但我相信PHP检查是否会话ID创建一个与之前的ID已经存在。
会话劫持问题的人担心的是,当有人发现了一个活跃用户的会话ID。 这是可以预防的方法很多,对,你可以看到更多信息这个页面上php.net和本文的会话固定
Answer 7:
不,会话ID是不是一个GUID,但两个用户不应该得到相同的会话ID,因为他们都存储在服务器端。
Answer 8:
<?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>
如果您的用户名是不同的或独特的,你可以使用这个会话代码