如何独特的是PHP的会话ID(How unique is the php session id)

2019-07-05 05:18发布

如何独特的是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):

  1. 客户端的IP地址
  2. 当前时间
  3. PHP线性同余发生器 -一个伪随机数发生器(PRNG)
  4. 特定于操作系统的随机源 -如果OS具有可用的随机源(例如/ dev / urandom的)

如果OS具有可用的随机源然后被会话ID的目的所产生的ID的强度高( 的/ dev / urandom的和其他OS随机源(通常)加密的安全的PRNG)。 然而,如果它不那么令人满意。

与会话身份生成的目标是:

  1. 最小化产生两个会话ID具有相同值的概率
  2. 使它非常具有挑战性的计算,生成随机密钥,并使用一个打一个

这是由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>

如果您的用户名是不同的或独特的,你可以使用这个会话代码



文章来源: How unique is the php session id
标签: php session guid