为什么保存数据库中的会话是好的?

时间:2012-12-17 09:13:19

标签: php performance codeigniter session security

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

5 个答案:

答案 0 :(得分:88)

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

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

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

答案 1 :(得分:17)

这个想法是会话无法被劫持。

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

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

您必须手动比较数据。

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:4)

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

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

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

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

答案 4 :(得分:3)

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

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