为什么保存会话保存在数据库中呢?

我已经看到,codeigniter有能力保存会话值在数据库中。
它说在数据库中保存会话是一个很好的安全实践。

但是我认为将会话信息保存在数据库中有助于提高性能。
他们只保存会话的一些元素,例如:

CREATE TABLE IF NOT EXISTS 'ci_sessions' ( session_id varchar(40) DEFAULT '0' NOT NULL, ip_address varchar(16) DEFAULT '0' NOT NULL, user_agent varchar(50) NOT NULL, last_activity int(10) unsigned DEFAULT 0 NOT NULL, user_data text NOT NULL, PRIMARY KEY (session_id) ); 

但是,如果一个网站使用更多的会话variables,如用户名,上次login时间等,我可以将它们保存在数据库中,并在程序中使用它们。

我必须将这些列添加到同一个表吗? 我认为将会话信息保存在数据库中仅有助于减lessWeb服务器的内存使用量(RAM)。 任何人都可以解释一下它在提高安全性方面的意义吗?

它不以任何方式提高安全性。

在数据库中存储会话的最常见和合理的模式是当你有几个前端服务器时,所以你需要一个共享的会话存储。

对于downvoters:文件系统中的文件不比数据库中的logging更安全。

这个想法是,会议不能被劫持。

会话ID存储在cookie中。 如果一个黑客可以窃取这个ID,他可以假装是别人,因为一个会话是由…标识的。

通过保存用户的会话ID,IP和代理服务器端(例如数据库),可以将数据库中保存的数据与客户端进行比较。 如果黑客窃取了某人的会话ID,则黑客可能没有匹配的IP和/或用户代理,从而导致用户不匹配,从而允许您显示或隐藏某些内容。

您必须手动比较数据。

具有基于文件的会话的常见安全伪造模式是将它们存储在/tmp或另一个共享目录中,第三方可以访问这些数据; 特别是在共享主机上,这可能是一个问题。 这可以通过正确的文件权限来防止。

将它们存储在数据库中意味着您拥有数据库的所有访问限制,但这也意味着您需要正确configuration它们并安全地设置数据库的物理存储。

它提高了性能,因为数据库服务器有更多的层来通过caching和内存中的存储来提高性能,而基于文件的会话总是会产生磁盘访问。 可以改进并发访问,因为您可以select其他并发机制而不是文件locking。 如果你的数据库服务器已经忙于正常的数据库工作,另外抛出会话处理可能会或可能不是一个好主意。

这是回答:我可以将它们保存在数据库中,并在程序中使用它们吗?

是的,您可以将它们保存在数据库中,但不需要为此创build单独的列。 它进入userdata列。

你可以用$this->session->set_userdata('sessionname',session value);来设置用户名$this->session->set_userdata('sessionname',session value);

你可以用$var=$this->session->userdata('sessionname');来检索它$var=$this->session->userdata('sessionname');

  • 应用程序需要能够在没有服务器关联的情况下在多个服务器上运行(将同一客户端的请求引导到同一服务器的方法)。 确保会话继续正常工作的简单方法是将会话存储在所有服务器通用的中央数据库中。

  • 该应用程序需要能够在共享主机上运行,​​在该共享主机上存在与将会话数据存储在文件系统中相关的重大安全问题。

  • 应用程序的性能需求非常苛刻,需要更复杂的会话数据存储解决scheme。 有许多解决数据库性能问题的现有想法和方法,当会话存储在数据库中时可以使用这些想法和方法。

你没有提到如果你使用PHP或MYSQL,但是将会话保存在数据库中并不能提供更好的性能,实际上恰恰相反。

PHP中默认的基于文件的会话要比从数据库中检索会话值要快得多,但是在每秒处理数千个查询之前,您不会真正注意到这种差异。