54

我已经看到 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)。任何人都可以解释它在什么意义上提高了安全性。

4

6 回答 6

111

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

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

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

于 2012-12-17T09:16:25.030 回答
28

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

会话 ID 存储在 cookie 中。如果黑客可以窃取该 ID,他就可以伪装成其他人,因为会话是由...标识的 ID。

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

您必须手动比较数据。

于 2012-12-17T09:18:09.273 回答
9

基于文件的会话的一个常见安全错误是将它们存储在/tmp或另一个共享目录中,其中数据可能可供第 3 方访问;特别是在共享主机上,这可能是一个问题。不过,这可以通过适当的文件权限来防止。

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

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

于 2012-12-17T09:20:24.017 回答
4

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

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

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

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

于 2012-12-17T09:44:15.130 回答
4

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

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

于 2016-10-27T20:24:05.847 回答
3
  • 应用程序需要能够在没有服务器关联的多个服务器上运行(将请求从同一客户端定向到同一服务器的方法)。确保会话继续正常工作的一种简单方法是将会话存储在所有服务器通用的中央数据库中。

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

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

参考

克里斯,S(2004 年,12 月 14 日)。在数据库中存储会话。克里斯·希夫莱特博客。https://shiflett.org/articles/storing-sessions-in-a-database

于 2016-04-11T12:34:06.480 回答