为什么将会话保存在数据库中是一种很好的保存方式



我已经看到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)
);

但如果一个站点使用更多的会话变量,如用户名、上次登录时间等,我可以将它们保存在数据库中并在程序中使用。

我必须将这些列添加到同一个表中吗?我认为将会话信息保存在数据库中只会帮助减少web服务器的内存使用量(RAM)。有人能解释一下它在什么意义上提高了安全性吗。

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

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

对于downvesters:文件系统中的文件的安全性不亚于数据库中的记录。

其理念是会话不能被劫持。

会话ID存储在cookie中。如果黑客可以窃取该ID,他可以假装是其他人,因为会话是通过…它的ID来识别的。

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

不过,您必须手动比较数据。

基于文件的会话的一个常见安全错误是将它们存储在/tmp或另一个第三方可以访问数据的共享目录中;尤其是在共享主机上,这可能是一个问题。不过,使用适当的文件权限可以防止这种情况发生。

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

它提高了性能,因为数据库服务器有更多的层通过缓存和内存存储来提高性能,而基于文件的会话总是会导致磁盘访问。并发访问可以得到改进,因为您可以选择除文件锁定之外的其他并发机制。不过,如果您的数据库服务器已经忙于常规的数据库工作,那么额外地进行会话处理可能是个好主意,也可能不是。

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

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

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

您可以使用检索$var=$this->session->userdata('sessionname');

您没有提到是否使用PHP或MYSQL,但将会话保存在数据库中并不能给您带来更好的性能,事实恰恰相反。

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

  • 应用程序需要能够在多台服务器上运行,而不需要服务器相关性(将来自同一客户端的请求定向到同一服务器)。确保会话继续进行的简单方法正常工作是将会话存储在中央数据库中所有服务器通用。

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

  • 应用程序的性能需求非常苛刻需要更复杂的会话数据存储解决方案。那里有许多现有的解决数据库问题的想法和方法吗性能问题,当会话存储在数据库。

参考

Chris,S(2004年12月14日)在数据库中存储会话Chris Shiflett博客。https://shiflett.org/articles/storing-sessions-in-a-database

相关内容

最新更新