PHP-我们应该在会话中包含哪些数据?

PHP-我们应该在会话中包含哪些数据?,php,Php,这是一个初学者的问题 在网站中,会话中应该或不应该包含哪些类型的数据?我理解,我不应该包括任何需要保持安全的信息。我对编程最佳实践更感兴趣。例如,可以在会话中包含一些数据,否则这些数据将作为依赖项注入从一页发送到另一页。这不等于创建了一个全局变量吗 一般来说,什么样的数据在会话表中有或没有位置 谢谢 JDelage在请求之间维护所需状态信息所需的最小信息量。通常,您可以在会话中放入任何您喜欢的内容。将信息放入必须存在的会话中以使页面运行时不会出现(技术)错误,这是一种不好的做法 我建议尽可能减少

这是一个初学者的问题

在网站中,会话中应该或不应该包含哪些类型的数据?我理解,我不应该包括任何需要保持安全的信息。我对编程最佳实践更感兴趣。例如,可以在会话中包含一些数据,否则这些数据将作为依赖项注入从一页发送到另一页。这不等于创建了一个全局变量吗

一般来说,什么样的数据在会话表中有或没有位置

谢谢


JDelage

在请求之间维护所需状态信息所需的最小信息量。

通常,您可以在会话中放入任何您喜欢的内容。将信息放入必须存在的会话中以使页面运行时不会出现(技术)错误,这是一种不好的做法


我建议尽可能减少会话中的数据量。

您可以在会话中保存的内容,这样您就不必再进行另一次数据库查询,以获取不会更改的信息。比如他们的用户名、地址、电话号码、帐户余额、网站上的安全权限等(这可能比你想要的要多,但可能有助于在已经发布的好答案中添加好的附加信息。)

既然您提到了最佳实践,那么您可能需要研究一些项目/技术,这些项目/技术可以用来进一步了解会话状态的概念。跨多个服务器水平扩展web应用程序的一个常见陷阱是维护它们之间的会话状态。(用户A登录到存储用户会话的服务器A,但在下一次请求时,会访问不知道用户A会话的服务器B,等等)

最后我总是对自己和同事说的一件事是,会话本身并不是存储数据的最佳场所,即使数据本质上是高度瞬态的。web服务器是请求/响应系统,而不是数据存储。它对前者进行了高度调整,但对后者并不总是那么好

因此,有一些方法可以将应用程序的会话数据(或任何有状态的数据,在web的RESTful无状态特性中,这些数据实际上应该保持在设计最小值)从web服务器外部化到另一个系统。这是一个非常常用的工具。还有内置会话替换(或各种框架/环境的可配置会话选项),它们将会话存储在SQL或MySQL之类的数据库中

我最近一直在考虑的一个想法是将会话数据(好的,任何在灾难中丢失的临时数据)存储在NoSQL数据库中。这是我目前的首选,但也不乏其他选择。CouchDB具有出色的水平伸缩性,MongoDB完全在内存中运行时速度惊人,等等

至少对我来说,这样做的一个主要好处是部署很容易变成非事件。任何给定服务器上的web服务都可以重新启动,其中的应用程序可以重新初始化,而不会丢失有状态的数据。如果数据被持久化到磁盘(即,不完全在内存中运行),那么服务器甚至可以在不丢失数据的情况下重新启动。服务器/服务可以进出服务器场,用户永远不会知道其中的区别

此外,外部化此数据允许您以可能有用的方式分析数据。查询它,在它上面运行度量,通过其他web应用程序或完全离线的工具与它交互,等等。随着项目复杂性的增加,它确实打开了选项


(同样,这并不是为了回答您的问题,而是为了添加您可能会发现有用的信息。这是我的同事和我最近一直在修补的东西,您的问题似乎是提及它的好地方。)

您应该将会话视为一次写入,多次读取存储。但是一个非常不稳定的问题——例如,如果所有会话突然消失,那么底层应用程序数据的状态应该是一致的(或可恢复的)

有一些例外情况(通常购物篮会存储在会话中,但您可能希望在结帐之前对“预订”项目执行库存调整)。在这里,项目可能会被添加/编辑/更改多次——因此它不是真正的写一次——但通过预保留库存项目,您可以保持数据库的可恢复性——但这意味着,当会话在没有完成的情况下过期时,您应该撤销库存调整


如果您开始尝试存储与各个页面转换相关的数据信息,那么当用户开始单击前进/后退按钮或打开新窗口时,您很快就会遇到问题。

我通常会在UID中放置CSRF哈希值、验证码值等+1@RobertPitt-什么是CSRF?Thx@JDelage在你最喜欢的搜索引擎中键入CSRF,难道你没有看到你的问题太广泛,没有“最佳实践”答案吗?关于:NoSQL中的会话存储“完全在内存中运行时”,为什么不将会话存储路径设置为ramdisk?如果你只使用它,不要把整个数据库服务器扔在中间。