【问题标题】:CodeIgniter sessionsCodeIgniter 会话
【发布时间】:2023-03-16 08:42:02
【问题描述】:
为什么建议将 CodeIgniter 会话存储在数据库表中?我知道这关乎安全,但如何?
为什么在使用 Session 类时需要在配置中设置加密密钥?
你应该解密会话吗?
$this->session->sess_destroy(); 是删除整个 cookie 还是仅删除您放入 cookie 中的数据?它是否完全结束会话,我的意思是撤消
$this->load->library('session')?
【问题讨论】:
标签:
php
codeigniter
session
【解决方案1】:
CI 的会话实际上是 cookie。加密,但仍然是 cookie。这就是为什么更喜欢将会话存储在数据库中的原因,因为您(据说)处理的攻击目标较少,特别是如果您使用自动转义查询的 Active Records(这样可以避免 SQL 注入)。
此外,与 cookie 不同,DB 没有如此有限的可用内存量,因此您可以在其中存储任意数量的数据,缓存操作,并将它们隐藏在前端。
我不确定为什么需要它,除了某些会话数据由 CI自动加密。因此,即使您不使用 Encryption 库,仍然会进行一些加密(例如,在保存会话 ID 的同时)。正如 Kai Qing 正确指出的那样,您不必对 CI 已经处理的数据进行任何解密。
$this->session->sess_destroy() 只是删除存储为会话的数据。虽然也是 cookie,但要删除整个内容,您需要使用专用功能(例如,查看 cookie 助手)。但请记住,当您调用此函数时,您也会删除 flash 消息(因为它们是会话),因此如果您只想取消设置某些元素,请使用 unset_userdata($item)。
它也不会结束库加载。至于任何其他库、类、控制器或其他任何东西,每次请求后,一切都从零开始重新加载。每次您发出请求时,脚本都会运行,重新初始化所有内容,当脚本结束时,所有内容都会像雨中的泪水一样丢失。这是 php 脚本的正常生命周期。如果在调用 session->sess_destroy() 后脚本未结束,会话库仍将被加载,但数据将被删除。
【解决方案2】:
回答您的第一个问题 - 建议通过 DB 存储,以最大限度地减少在会话中找到的数据并降低愚蠢的风险 - 就像一个助手。由于 DB 存储的会话只会将 id 存储在 cookie 中,因此可用的信息会减少为不可用的信息。
您无需解密任何内容。引擎会为您处理。
至于毁灭——我不知道。但我想一个简单的 var_dump 会回答这个问题。