13

我有一个 php 应用程序,我正在使用 $_SESSION 本身为用户保存会话变量。将其存储在数据库中有什么特别的好处吗?

我正在寻找一篇可靠/经过充分研究的文章,其中更多地讨论了这一点。我还没有找到任何东西。

4

5 回答 5

5

将其存储在数据库中的优点是数据只要您希望它存在就存在。

您的浏览器将根据会话的设置方式销毁会话,这使其有点不可靠。但是,我还找不到关于此的文章,但这就是我在这种情况下使用的约定。

任何需要长期存储的数据,例如我存储在数据库中的用户详细信息和活动。任何仅与当前工作区相关的数据,例如登录站点和发表一些评论等,都可以存储在会话中。例如,我将用户身份验证详细信息存储在会话中,以不断检查用户是否登录以及是否将他/她重定向到正确的页面。

这在检查整个应用程序的访问权限时会产生奇迹。

对我来说,将用户详细信息存储在数据库中要安全得多,因为它不能像 $_SESSION 那样被公开访问。

如果你愿意,请不同意我的看法。

于 2011-05-25T09:34:58.383 回答
5

我会说存储在数据库中更好。因为

  1. 当您使用共享主机托管您的站点时,PHP 使用相同的路径来存储所有用户的会话,而不是在您的文件夹中。

  2. 您可以轻松跟踪用户及其状态。

  3. 对于在多台服务器上运行的应用程序,您可以将所有会话数据存储在一个数据库中。

这篇文章可能会有所帮助。

于 2011-07-17T12:58:29.827 回答
3

好吧,这是一个古老的问题。就我个人而言,我从我那个时代学到的东西。除非您的站点开始大规模蓬勃发展,否则您需要开始为系统的各个方面使用多个服务器,例如运行许多镜像系统的负载平衡。或者需要为过度填充的系统稍微提高性能,使用数据库相关会话或基于文件的会话的好处确实没有什么不同。当然我可能是错的,这只是我个人对我自己经验的看法。就像你一样,我从来没有真正找到任何文章、帖子和其他真正让两者并排测试的文章,我什至认为我没有找到任何真正独立测试的东西。

我听说他们可以被欺骗,但迄今为止还没有看到证明这一概念的证据。所以除了这个潜力之外,我坚持基于文件。除非我使用像代码点火器这样的系统,否则会话似乎可以处理更好的数据库驱动而不是没有。

于 2011-05-25T09:41:41.577 回答
2

在某个时间点,您将不得不在会话中存储一些东西。无论是所有会话变量还是只是会话表中一行的 ID。在这种情况下,更改存储在严重加密会话中的 ID 并劫持不同的会话将相当容易。

考虑一下:

完整会话选项。它存储了用户 ID、用户名和加密和散列密码,以便每次调用页面时都会验证我的登录。要劫持其他人的会话,我必须知道他们的用户 ID、用户名和密码哈希,并能够克服会话的固有加密。

会话 + 数据库选项。这只是存储了一个会话 ID,它引用了数据库中的一行。要更改我想要的会话,我所要做的就是破坏会话的加密并说在会话 ID 中添加一个。然后,我将被认证为在我之后登录的用户。

如果您有很多额外信息,您可以将登录详细信息存储在会话中,然后在会话表中存储任何与登录无关的数据,但是您也可以不再需要额外的表并从任何相关表中提取数据你需要。

于 2011-05-25T09:34:10.403 回答
0

根据我的短暂经验,您应该$_SESSION 只存储不需要在不同设备中唯一用户打开的所有会话中刷新的数据。(移动/桌面/等)

换句话说,您确定的数据永远不会像 userID 那样改变

例如,我将用户个人资料图片路径存储到 $_SESSION其中,这导致了一种奇怪的用户体验。在桌面上更改个人资料图片时,它不会刷新用户手机上的个人资料图片。不过,其他用户看到了新图片。实际上,路径已刷新到数据库中,但没有在$_SESSION. 登出和登入不会改变任何东西。

请记住,$_SESSION即使是同一用户登录,默认行为是每个浏览器传递的 cookie 都会有所不同。您必须执行 asession_destroy()以避免被旧数据卡住。

$_SESSION我猜也可能存储非常临时的数据。

注意:在这些参数中,全局会话的基本需求是让变量全局可用

于 2018-01-22T18:31:22.253 回答