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

kir*_*ppa 46 php security performance session codeigniter

我已经看到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)
);
Run Code Online (Sandbox Code Playgroud)

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

我是否必须将这些列添加到同一个表中?我认为在数据库中保存会话信息只会有助于减少Web服务器的内存使用量(RAM).任何人都能解释它在何种意义上提高了安全性.

zer*_*kms 90

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

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

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

  • @kiriappa:说"记忆"是什么意思?什么样的记忆?在任何情况下,会话数据都不存储在RAM中."在这种情况下,它不会导致提高性能" - 这个问题毫无意义.如果没有详细的调查*,你无法说某些东西是否能提高性能.性能优化过程几乎没有统一.因此,在每种特定情况下,您都需要执行不同的优化.那是. (5认同)
  • 在每个需要会话的页面上点击数据库是个好主意吗? (4认同)
  • @kiriappa:我也没说过它更安全.它们中没有任何东西或多或少是安全的,因为"它取决于" (3认同)
  • `文件系统中的文件不比数据库中的记录安全.但这是我在http://www.hackingwithphp.com/10/3/7/files-vs-databases上找到的:"如果会话数据存储在文件中,文件需要位于某个位置的共享位置 - 不适合性能或锁定原因." (2认同)

Tim*_* S. 17

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

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

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

您必须手动比较数据.

  • @Ayesh K:会话存储与**劫持没什么关系. (8认同)
  • 恶意用户可以伪造SESSID和IP地址,此检查不会使您的应用程序更安全. (3认同)
  • 它与这个问题有什么关系?无论您在何处存储会话 - 您仍需要在客户端的某个位置保留SID. (2认同)

dec*_*eze 9

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

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

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

  • “并发访问也更好,因为不需要文件锁定。” --- 你仍然需要维护行锁 (2认同)