在 PHP 中实现 _SESSION 美元背后的细节是什么?


What are details behind implementation of $_SESSION in PHP?

因此,我在管理会话时从安全性中学到的是,最佳做法是将生成的会话ID保存到客户端cookie中,其余数据保存在服务器上。那么_SESSION美元到底发生了什么?在官方PHP文档中,我只发现了很少的描述,没有说什么。

我是否需要在服务器上的数据库中创建会话表,还是 $_SESSION 创建一些临时表并保存所有需要的数据?问题是我需要构建良好可靠的系统,同时有大约 1000 个用户登录到服务器,所以我不知道"让"_SESSION 美元完成所有工作有多好。

$_SESSION 如何生成 ID?是 IP 和浏览器组合的一个 ID 吗?我的意思是,这样它就不需要使用 cookie 的许可,而是(服务器)为 IP 和浏览器保存一些 ID,这是客户端没有任何会话数据或任何内容。这只是我思考它可能会如何发展的方式,但我不确定该怎么做,正确的方法是什么,所以你能帮我吗?

$_SESSION为每个

会话生成一个随机ID,该ID不会链接到IP或其他客户端信息,例如用户代理。

  • PHP 为用户生成一个 cookie,它包含会话 ID。

  • $_SESSION数组被序列化并保存到服务器上的文件中。

  • 当用户使用 PHP 会话 cookie 连接时,将检查 ID,然后可以从文件中反序列化 $_SESSION 数组。

从安全的角度来看,重要的是要注意PHP不会根据IP或用户代理来验证用户,因此用户可以窃取其他用户的cookie和会话数据。如果你想要这个功能,那么你可以很容易地实现一些东西,在会话数组中存储一个哈希值,并在恢复会话时检查它。

也可以编写自己的会话实现,您需要做的就是创建一个具有唯一 ID 的 cookie,然后如您所提到的 - 将数据存储在数据库中。我个人更喜欢创建自己的UserSession类,它给了我完全的控制。

关于会话的事情是它存储在浏览器的客户端中,因此如果您要制作 2 个网站并分配

 $_SESSION['logged']=1;//assign this in website 1 as value if logged
 $_SESSION['logged']=1;//assign this in website 2 as value if logged

您仍然可以在两个系统中登录,您是否也知道您可以使用名为 faceniff 的 Android 应用程序劫持 Facebook 帐户,如果它没有"https",就像通过创建相同的会话名称和值来伪装您是帐户持有人一样

我所做的是当用户登录时,我将MD5哈希值分配为会话值并将其插入到数据库中用户的行中,然后检查数据库值是否等于浏览器会话所以数据库看起来像这样

id   username   password         session_code
1    imbatman   superman     12sd5%sda812312y34356 //note this md5 is only an example 
                                                  //but it looks like that but longer i think

在注销时,我清除数据库会话并销毁会话

id   username   password         session_code
1    imbatman   superman     

但我仍然是PHP的新手,并且仍在寻找在我的网站中应用更多安全性的方法,但现在这就是我为防止渗透所做的工作