【问题标题】:Using Isset with native sessions in CodeIgniter在 CodeIgniter 中使用 Isset 和本机会话
【发布时间】:2011-09-08 12:37:40
【问题描述】:

我已经了解 CI 处理会话的方式与原生会话不同,我觉得将所有数据存储在 cookie(?) 中有点不安全,这与 PHP 的原生会话只存储会话 ID(?) 不同。所以我决定使用没有 CI native_session 库的本地会话。

现在,我知道 CI 中的输入类使用如下的真/假语句验证 Isset:

if ($this->input->post('something'))

这会导致 Isset 函数无法工作(它会给出错误)。但是,我想使用 Isset 函数检查我的本地会话,那么我该怎么做呢?我试过了

if (isset($_SESSION['keyHere']))

这给了我一个错误。

所以总结一下:我想在我的会话数组上使用 Isset,就像我使用的感觉一样

if ($_SESSION['keyHere'])

没有 Isset 可能是“危险/愚蠢”。

另外,作为最后一个问题,我很好奇您认为哪种会话处理最安全? CI 的 Session Class 还是 PHP 对服务器端存储的原生处理等?我非常希望在会话方面尽可能安全,无论这是否意味着我必须编写更长的代码。

【问题讨论】:

    标签: session codeigniter isset


    【解决方案1】:

    好的,让我们谈谈您在使用 isset 时遇到的问题! 我同意后面的所有答案,空函数是一个很好的尝试,也使用 array_key_exists,但是 isset 在 php 语言中有自己的位置。

    一开始你并没有发布你得到的错误,因为@GolezTrol 说你可能在使用 session_start() 时遇到了问题。

    您需要将它放在页面顶部,在任何脚本之前。我会把这段代码放在所有脚本之前,最好把它放在 config/config.php 页面中,在它的开头,或者在根 index.php 上

    使用它,您将在系统的所有页面上启动会话。 好吧,关于你的第二个问题。

    我认为 PHP 的 session native 非常安全,但 Codeigniter 的 session 也非常好。

    Codeigniter 在安全方面存在一些问题,当我们谈论 cookie 时,如果我们正在处理系统的重要数据,它很难使用它,特别是如果其他人可以编辑它,考虑到我描述的所有内容上面,我可以说 Codeigniter 有一个很好的会话库,即使我们正在处理重要的数据。

    如果你不相信cookie的安全性,就放在数据库上,你会遇到麻烦的。好在它有能力和设施在系统的每个地方使用这个类!

    其实我用的是数据库的方式,推荐一下。

    【讨论】:

      【解决方案2】:

      我会使用array_key_exists 而不是issetisset 还会检查值是否不为 null,因此具有现有键但值为 null 的数组仍将返回 false。你知道它是一个数组并且你想检查一个键是否存在,所以使用 array_key_exists 是最有意义的。

      但这不是问题所在。 :D

      我认为您需要先致电session_start()

      只要您在单个网络服务器上,PHP 的本机会话处理就可以正常运行。

      【讨论】:

        【解决方案3】:
        $data=$this->session->userdata("session variable");
        
        if($data)
        {
          // do something
        }
        

        在您的 CI 代码文件中使用它。它一直对我有用!

        【讨论】:

          【解决方案4】:
          $logindata = $this->session->userdata('username');
          
          if ($logindata !== FALSE)
          {
            //it exists
          }
          

          可能有帮助!

          【讨论】:

            【解决方案5】:

            我一直使用php functionempty();,但如果你不知道自己在做什么,它的工作方式会有所不同。

            • 如果它是一个空数组,它将 返回 FALSE
            • 如果为 NULL,则返回 FALSE

            我个人对 CI 2.0.2 中的新 session class 没有什么问题。创建一个名为“会话”的表并将会话存储在数据库中,使用sess_use_database 为真。还将sess_encrypt_cookies 设置为true,最后,如果您希望会话与用户IP 匹配,请使用sess_match_ip。哦,请确保设置加密密钥,这将使其更加安全。

            PHP 会话很好,但我个人更喜欢 CI 会话,因为它提供了更大的灵活性。尤其是当您使用负载均衡器运行多个 Web 头时。

            希望有帮助!

            【讨论】:

              【解决方案6】:

              为什么不使用内置的CodeIgniter Session Class?在不强制您使用isset() 方面,它将提供与输入类相同的功能。

              它允许加密会话并使用它自己的会话实现。

              $this->session->userdata("keyHere");  // returns false if not set
              

              【讨论】:

                【解决方案7】:

                您确实应该使用 codeigniter 会话类。您可以使其将会话数据存储在数据库中,以便 cookie 仅包含一个唯一标识符。您还可以将该 cookie 设置为使用 codeigniter 安全密钥进行加密。

                然后,当您访问会话信息时,它就像普通的输入法一样,因此您可以只使用 if($this->session->userdata('name')) 而不是使用 isset 或 empty 或其他。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-07-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-08-03
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-04-07
                  • 1970-01-01
                  相关资源
                  最近更新 更多