多么独特的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行):

    客户
  1. IP地址
  2. 当前时间
  3. PHP线性同余生成器 - 伪随机数生成器(PRNG)
  4. 特定于操作系统的随机源 - 如果操作系统有可用的随机源(例如/ dev / urandom)
  5. 如果操作系统有可用的随机源,那么为了成为会话ID而生成的ID的强度很高( / dev / urandom和其他OS随机源(通常)是加密安全的PRNG )。但如果它没有那么它是令人满意的。

    生成会话标识的目标是:

    1. 最小化生成具有相同值的两个会话ID的概率
    2. 使计算生成随机密钥并使用一个非常具有挑战性。
    3. 这是通过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与大概率。

我还没有找到关于此的确认,但我相信php会在创建具有该ID的会话ID之前检查会话ID是否已存在。

人们担心的会话劫持问题是当有人发现活动用户的会话ID时。这可以通过多种方式加以防范,有关详细信息,请参阅此页面在php.net和本文关于会话固定

不,会话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>

如果您的用户名不同或唯一,则可以将此代码用于会话

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top