【问题标题】:How do session_id() and $_SESSION relate? (PHP)session_id() 和 $_SESSION 有什么关系? (PHP)
【发布时间】:2015-08-15 04:44:31
【问题描述】:

两者有什么区别?

根据我对一般身份验证工作原理的理解,ID 存储在服务器端和客户端。对于每个请求,客户端都会发送 cookie,匹配服务器中的 ID,并输出所需的数据。因此,当我这样做时:

session_start();
session_id();

cookie 也存储在客户端。这对我来说很有意义,因为在我看来 session_id() 只是在生成该 ID。然后,我们可以将此 ID 存储到(例如)给定用户的用户表中。然后,对于每个浏览器请求,我们只需将 cookie 中的 ID 与数据库中的 ID 进行匹配。

但是,为什么我们不能只使用 ID 进行身份验证?我已经看到在线代码执行以下操作,但我不太明白在$_SESSION 中设置字段的意义是:

session_start();
$_SESSION['username'] = 'Billy Bobby';

【问题讨论】:

  • RTFM: "session_id() 用于获取或设置当前会话的会话 ID。"
  • 除非您要求用户输入,否则您还能从哪里获得“Billy Bobby”?
  • 为什么不能将名称与ID一起存储在数据库中? (有点像 Rails 中的 session_token)

标签: php session cookies


【解决方案1】:

会话 ID 存储在 cookie 客户端。在服务器端,数据(来自 $_SESSION)保存在该服务器 ID 密钥下的文件中(通常)。

您可以将所有数据保存在数据库中,但默认情况下,一个页面视图和第二个页面视图之间没有持久性。

Session ID 确实与身份验证无关。尽管您可以使用会话数据来管理跨多个请求的身份验证状态。

【讨论】:

  • 在我更熟悉的 Rails 中,我通过为 users 表设置 session_token 列来跟踪状态。然后,当用户登录成功时,会在数据库中生成一个令牌,他/她的 cookie 中就有这个令牌。因此,对于每个请求,cookie 可用于从数据库中查找登录用户。如果我没记错的话,似乎在 PHP 中使用 $_SESSION 来存储数据。
  • Rails 会话令牌类似于 php 中的会话 ID,我认为。在 PHP 中,$_SESSION 对象只是一个抽象接口。它实际上是将状态信息保存在磁盘上的文件中(默认情况下)。您还可以配置 PHP 以将会话数据存储在数据库表中。
  • 另外,值得指出的是,PHP 会自动连接一些会话逻辑,但默认情况下并不完全安全。 IIRC,它使用 int 作为令牌,因此有人可以遍历所有可能的令牌并劫持其他人的会话数据。或者,如果您在同一台服务器上有多个网站,您可能会发生冲突。最好在 $_SESSION 周围编写包装器 getter/setter 函数,在会话中保存随机位的随机数据,以便在访问其他会话数据(如用户名)时可以确认。
  • 存储在 $_SESSION 对象中的值(例如设置$_SESSION['name'] = 'Bob')存储在磁盘上的那个“文件”中,对吧?这些值不存储在 cookie 中;只有会话 ID 存储在客户端?
  • 没错。唯一存储在客户端中的是 ID。在磁盘上 PHP 只是序列化数据并将其保存在服务器磁盘上的那个 ID(本质上是一个带有键值对的大数据数组)下
猜你喜欢
  • 2018-05-09
  • 2015-12-06
  • 2015-03-17
  • 2016-11-03
  • 2012-05-17
  • 2011-12-27
  • 2016-05-04
  • 2016-09-28
  • 2013-07-02
相关资源
最近更新 更多