5

我已经阅读了 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 对服务器端存储的原生处理等?我非常希望在会话方面尽可能安全,无论这是否意味着我必须编写更长的代码。

4

7 回答 7

2

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

起初你没有发布你得到的错误,因为@GolezTrol 说你可能在 session_start() 上遇到了问题。

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

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

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

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

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

实际上我使用的是数据库的方式,我建议它。

于 2011-09-08T03:35:05.013 回答
1
$logindata = $this->session->userdata('username');

if ($logindata !== FALSE)
{
  //it exists
}

可能有帮助!

于 2012-11-30T07:45:35.563 回答
1

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

但这不是问题。:D

我想你需要先打电话session_start()

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

于 2011-06-04T21:38:39.157 回答
1
$data=$this->session->userdata("session variable");

if($data)
{
  // do something
}

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

于 2012-11-22T10:06:13.903 回答
0

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

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

于 2012-11-08T09:29:09.277 回答
0

为什么不使用内置的CodeIgniter 会话类?它将提供与输入类相同的功能,而不是强迫您使用isset().

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

$this->session->userdata("keyHere");  // returns false if not set
于 2011-08-09T21:28:04.763 回答
0

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

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

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

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

希望有帮助!

于 2011-06-16T20:24:09.617 回答